将列值转换为列名SQL Server

时间:2019-02-15 15:47:08

标签: sql sql-server tsql

我有一个具有以下架构的表。希望获得与SQL Server中预期结果相同的结果。由于“值”列为字符串,因此数据透视不起作用。请提出实现此目标的有效方法。谢谢!

表格:

 Dim Key(String) , Dim Value (String)
   AB                XY1 
   AB                XY2
   CD                XY3
   CD                XY4

预期结果

New columns=>  AB      CD
Row values =>  XY1     XY3
               XY2     XY4

2 个答案:

答案 0 :(得分:5)

您想要row_number()

select max(case when key = 'ab' then Value end) as ab, 
       max(case when key = 'cd' then Value end) as cd
from (select t.*, 
             row_number() over (partition by key order by Value) as seq
      from table t
     ) t
group by seq;

但是,您的pivot版本也应与row_number()一起使用。

编辑:

select tt.*
from (select t.*, 
             row_number() over (partition by [key] order by Value) as seq
      from table t
     ) as t pivot 
     ( max(value) for [key] in ([ab], [cd]) 
     ) tt;

答案 1 :(得分:0)

自动加入应该起作用。但是,您没有提供SQL的完整业务需求。

您期望得到什么结果?

New columns=>  AB      CD
Row values =>  XY1     XY3
               XY2     XY4

或者,

New columns=>  AB      CD
Row values =>  XY1     XY4
               XY2     XY3

或者

New columns=>  AB      CD
Row values =>  XY1     
               XY2     
                       XY3
                       XY4 

您的SQL看起来像这样

select ab.value as "AB", cd.value as "CD"
from (select * from t where key='ab') ab
    ,(select * from t where key='cd') cd

但是上面的SQL给你这个结果,

New columns=>  AB      CD
Row values =>  XY1    XY3 
               XY2    XY3 
               XY1    XY4  
               XY2    XY4          

您应该根据需要对SQL进行一些修改。希望对您有帮助!