SQL: l oop над каждой записью в таблице и создайте новую с именем строки, столбцом и записью - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть SQL серверная таблица с именем "tb_Object", которая выглядит следующим образом:

ObjektID    Name    ID1    ID2    ID3
----------------------------------------
     1      O1       1     2.30   0.002
     2      O2       2     3.40   0.004
     3      O3       1     2.10   0.200
...                  

Я хочу преобразовать ее в таблицу, которая выглядит следующим образом:

PK_ID     ObjektID    Name       ColName
-----------------------------------------
  1         1         O1    1      ID1
  2         2         O2    2      ID1
  3         3         O3    1      ID1
... 
110         1         O1    2.30   ID2
111         2         O2    3.40   ID2
112         3         O3    2.10   ID2
...
220         1         O1    0.002  ID3
221         2         O2    0.004  ID3
222         3         O3    0.200  ID3
... 

Я знаю, что это довольно просто в Python. Но я понятия не имею, как я могу сделать это в SQL / T- SQL, особенно потому, что я не могу использовать индексацию. Кто-нибудь знает, как с этим справиться умно?

1 Ответ

1 голос
/ 27 февраля 2020

Если количество столбцов не слишком велико, вы можете использовать оператор UNION, чтобы преобразовать его в нужный формат:

;with cte as
(select 1 as ObjektID,'O1' as Name,1 as ID1,2.3 as ID2,0.002 as ID3 UNION
select 2 as ObjektID,'O2' as Name,2 as ID1,3.4 as ID2,0.004 as ID3 UNION
select 3 as ObjektID,'O3' as Name,1 as ID1,2.1 as ID2,0.200 as ID3)

select  row_number() over(order by Objektid,Name,ColName) as PK_ID,
        a.*
from
(select ObjektID,Name,'ID1' as ColName,ID1 as Value from cte
UNION
select ObjektID,Name,'ID2' as ColName,ID2 as Value from cte
UNION
select ObjektID,Name,'ID3' as ColName,ID3 as Value from cte) a

Надеюсь, это поможет.

Редактировать: еще один способ сделать это будет с помощью UNPIVOT:

SELECT  row_number() over(order by ObjektId,ColumnName) as PK_ID,
        ObjektID, name, ColumnName, Value  
FROM   
   (select ObjektID,Name,ID1,ID2,ID3 from cte) p  
UNPIVOT  
   (Value FOR ColumnName IN   
      (ID1, ID2, ID3)) as unpvt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...