Sql server SQL:循环表中的每个条目,并使用rowname、Columname和entry创建一个新条目

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 ...

我有一个名为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
...                  
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函数!谢谢!