将列值转换为列名称SQL server

将列值转换为列名称SQL server,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表,下面是模式。希望在SQL server中获得预期结果。Pivot不工作,因为值列为字符串。请建议实现这一目标的有效方法。谢谢 表: Dim Key(String) , Dim Value (String) AB XY1 AB XY2 CD XY3 CD XY4 预期结果 New columns=> AB CD Row

我有一个表,下面是模式。希望在SQL server中获得预期结果。Pivot不工作,因为值列为字符串。请建议实现这一目标的有效方法。谢谢

表:

 Dim Key(String) , Dim Value (String)
   AB                XY1 
   AB                XY2
   CD                XY3
   CD                XY4
预期结果

New columns=>  AB      CD
Row values =>  XY1     XY3
               XY2     XY4
您需要
行号()

但是,您的
pivot
版本也应与
行编号()配合使用

编辑:

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;

自连接应该有效。但是,您没有为SQL提供完整的业务需求

你期望的结果是什么

New columns=>  AB      CD
Row values =>  XY1     XY3
               XY2     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进行一些修改。希望能有帮助

为什么
XY1
XY3
在同一行,而不是
XY4
?为什么您认为当值是字符串时无法透视?AB和CD是新列名吗?您如何知道AB和CD之间的关系?您有其他索引列吗?@SeanLange Yes AB和CD是新列名。通常,透视操作的输入需要三维(列、字段、属性)。一个是透视表中的X轴,第二个是透视表中的Y轴,第三个将转换为度量值,并进入透视表中一列和一行的交点处的值。度量,通常称为聚合,可以是总和、平均值、最小值、最大值和其他一些。这假设第二列(在他的问题中称为值)顺序是匹配项的方式。似乎是个大问题assumption@Hogan. . . 不,实际上,
键在这里很重要。如果密钥非常未知,则
OP
可能需要
Dynamic SQL
。谢谢@yogesharma。它起作用了。您能否指出如何在Pivot中执行此操作,因为Pivot需要聚合函数。所以row_number()分区序列需要正确地用作Min或Max correct?我建议不要使用pivot。这种条件聚合更易于编码和理解。与pivot相比,它还有一点性能优势。
New columns=>  AB      CD
Row values =>  XY1     
               XY2     
                       XY3
                       XY4 
select ab.value as "AB", cd.value as "CD"
from (select * from t where key='ab') ab
    ,(select * from t where key='cd') cd
New columns=>  AB      CD
Row values =>  XY1    XY3 
               XY2    XY3 
               XY1    XY4  
               XY2    XY4