如何通过聚合行值来创建SQL PIVOT列名?

时间:2013-07-26 15:53:33

标签: sql-server pivot

我猜这需要用动态sql完成,但如果有可能的话我更喜欢简单的查询。到目前为止的搜索已经向我展示了一些例子,但我对于透视表是完全新的,我可能没有看到森林的树木。谢谢你的帮助。

我有一个看起来像这样的表,其中'begin'和'end'列可以包含基本上任意的数字(它是图形数据,那些是节点数)。

graph_id    begin   end distance
597857  145 147 2.59
601978  107 147 2.86
596794  107 147 2.92
601978  145 147 2.98
601635  145 147 3.06
601635  107 257 3.06
599472  147 151 3.21
601635  107 147 3.29
601978  107 257 3.31
596794  107 257 3.32

我想创建一个看起来像这样的表,基本上每行都是一个图表,每列都是边缘:

graph_id    145:147 107:147 107:157 147:151 107:257
597857  2.59    NULL    NULL    NULL    NULL
596794  NULL    2.92    NULL    NULL    3.32
601978  2.98    2.86    NULL    NULL    3.31
601635  3.06    3.29    NULL    NULL    3.06
599472  NULL    NULL    NULL    3.21    NULL

感谢任何帮助;我不确定如何构建正确的聚合,我的大脑拒绝将自己包裹在数据透视表中。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在两个不同的静态查询中执行此操作,但需要注意一点:您必须拥有所有可能的“开始:结束”可能性的列表。您可以通过运行以下命令编译此列表:

select distinct cast([begin] as varchar(10)) + ':' + cast([end] as varchar(10)) as begin_end
from yourtable

然后,您将这些值并将其粘贴到下面的查询中。

with cte1 as (select graph_id, cast([begin] as varchar(10)) + ':' + cast([end] as varchar(10)) as begin_end, distance
              from yourtable)

select *
from cte1
pivot (
   max ([distance])                                                   
   for begin_end in ([145:147], [107:147], [107:257], [147:151]))         
   as graphtable

如果您希望它们发生更改,则每次运行时都必须更改“开始:结束”值的列表。如果你错过了一个,你就不会在结果中看到它。这对您的申请可能是也可能不是不切实际的。否则,您需要动态SQL查询。