2013-07-26 96 views
1

我猜測這需要用動態sql來完成,但如果可能的話,我更喜歡簡單的查詢。到目前爲止,搜索已經向我展示了一些例子,但我對於數據透視表是全新的,並且我可能沒有看到樹木的森林。謝謝你的幫助。如何通過聚合行值來創建SQL PIVOT列名稱?

我有一張表,看起來像這樣,'開始'和'結束'列可以包含基本上任意數字(它是圖形數據,這些是節點號)。

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

你可以在兩個不同的靜態查詢中做到這一點,一個警告:你必須有一個所有可能的「開始:結束」可能性的列表。你可以通過運行編譯這個列表:

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

相關問題