【问题标题】:How do I create SQL PIVOT column names by aggregating row values?如何通过聚合行值来创建 SQL PIVOT 列名?
【发布时间】:2013-07-26 15:53:32
【问题描述】:

我猜这需要使用动态 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

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

谢谢!

【问题讨论】:

    标签: sql-server pivot


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2021-07-05
      • 2020-04-21
      • 2023-04-07
      • 2010-11-17
      • 2016-10-16
      相关资源
      最近更新 更多