我猜这需要用动态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
感谢任何帮助;我不确定如何构建正确的聚合,我的大脑拒绝将自己包裹在数据透视表中。
谢谢!
答案 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查询。