1

我猜这需要使用动态 sql 来完成,但如果可能的话,我更喜欢简单的查询。到目前为止的搜索已经向我展示了一些示例,但我对数据透视表完全陌生,而且我可能没有只见树木不见森林。谢谢你的帮助。

我有一个看起来像这样的表,其中“开始”和“结束”列基本上可以包含任意数字(它是图形数据,这些是节点号)。

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

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

谢谢!

4

1 回答 1

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 查询。

于 2013-07-26T21:08:30.830 回答