Sql server SQL:循环表中的每个条目,并使用rowname、Columname和entry创建一个新条目
我有一个名为tb_Object的SQL Server表,如下所示:Sql server SQL:循环表中的每个条目,并使用rowname、Columname和entry创建一个新条目,sql-server,tsql,Sql Server,Tsql,我有一个名为tb_Object的SQL Server表,如下所示: 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 ...
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
...
我想将其转换为如下所示的表:
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中做到这一点,特别是因为我不能使用索引。有人知道如何巧妙地处理这个问题吗?如果列数不太多,可以使用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;
谢谢但是我想对于100多行来说,这可能不是一个非常实用的解决方案?行的数量可能不会有太大的影响,但列的数量会有很大的影响。如果您只处理3列,这个查询应该可以很好地工作。我添加了另一种使用UNPIVOT的方法…检查一下哦,很好,不知道t-SQL中有PIVOT和UNPIVOT函数!谢谢!