将列值转换为列名称SQL server
我有一个表,下面是模式。希望在SQL server中获得预期结果。Pivot不工作,因为值列为字符串。请建议实现这一目标的有效方法。谢谢 表:将列值转换为列名称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
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