2010-01-17 151 views
0

我有一個表像這樣的(當然還有更多的值,但你的想法):樞軸SQL語句

ID  Name 
---  ---- 
1  A 
1  B 
2  C 
3  D 
4  A 
4  D 
4  E 
4  F 
4  G 
4  H 

我想寫給出一個查詢,將輸出這是一個ID不能有超過6個名字。

ID  Name1  Name2  Name3  Name4  Name5 Name6 
--- ------  ------  ------ ------ ------ ----- 
1  A    B 
2  C 
3  D 
4  A    D   E   F   G  H 
+0

@Lwoodyiii - 我在我的回覆中發現了一個錯誤。我不認爲它會外推到6 - 建議你稍微擴展你的問題,以給出完整的圖片。 – 2010-01-18 00:28:51

+0

@Martin我編輯它。請把你的答案備份起來,我想這可以擴展到正確的答案。我認爲這是一個有用的開始。 謝謝! – LWoodyiii 2010-01-18 00:32:53

+0

什麼版本的SQL Server? – 2010-01-18 00:37:24

回答

4

嘗試:

WITH rows AS (
    SELECT t.id, 
      t.name, 
      ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) 'rank' 
    FROM TABLE t) 
    SELECT r.id, 
     MAX(CASE WHEN r.rank = 1 THEN r.name ELSE NULL END) AS Name1, 
     MAX(CASE WHEN r.rank = 2 THEN r.name ELSE NULL END) AS Name2, 
     MAX(CASE WHEN r.rank = 3 THEN r.name ELSE NULL END) AS Name3, 
     MAX(CASE WHEN r.rank = 4 THEN r.name ELSE NULL END) AS Name4, 
     MAX(CASE WHEN r.rank = 5 THEN r.name ELSE NULL END) AS Name5, 
     MAX(CASE WHEN r.rank = 6 THEN r.name ELSE NULL END) AS Name6, 
    FROM rows r 
GROUP BY r.id 

非CTE相當於:

SELECT r.id, 
     MAX(CASE WHEN r.rank = 1 THEN r.name ELSE NULL END) AS Name1, 
     MAX(CASE WHEN r.rank = 2 THEN r.name ELSE NULL END) AS Name2, 
     MAX(CASE WHEN r.rank = 3 THEN r.name ELSE NULL END) AS Name3, 
     MAX(CASE WHEN r.rank = 4 THEN r.name ELSE NULL END) AS Name4, 
     MAX(CASE WHEN r.rank = 5 THEN r.name ELSE NULL END) AS Name5, 
     MAX(CASE WHEN r.rank = 6 THEN r.name ELSE NULL END) AS Name6, 
    FROM (SELECT t.id, 
       t.name, 
       ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) 'rank' 
      FROM TABLE t) r 
GROUP BY r.id 

參考:

+0

明天我會試試這個,如果你有它的話+1! :) 謝謝! – LWoodyiii 2010-01-18 06:40:21

+0

它工作!謝謝 :) – LWoodyiii 2010-01-19 12:32:58

0

我創建了一個名爲pivot_query的存儲過程,使得PIVOT語句更加靈活一些。它的來源是here。還有一個關於如何使用它的example

借用一塊從下面OMG小馬代碼,並更改查詢了一下, 然後調用pivot_query應該是這樣的:

declare @mySQL varchar(MAX) 

set @mySQL = ' 
SELECT 
    t.id, 
    t.name, 
    ''Name'' + cast(ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) as varchar(2)) rank 
FROM 
    TestData t' 

exec pivot_query @mySQL, 'Id', 'rank', 'max(Name)' 

和現在的結果是這樣的:

Id   Name1 Name2 Name3 Name4 Name5 Name6 
---------- ----- ----- ----- ----- ----- ----- 
1   A  B  NULL NULL NULL NULL 
2   C  NULL NULL NULL NULL NULL 
3   D  NULL NULL NULL NULL NULL 
4   A  D  E  F  G  H  

不完全確定你要展示什麼,但。 :-)

這不會本質上限制輸出到6個列,雖然,它會繼續往上走,除非你添加一個where子句來明確排除上述行列6.

+0

關閉,但沒有雪茄。我不希望G&H顯示在Name_7和Name_8列中,而是顯示在Name5和Name 6列中。我也不想在測試數據表中輸入名稱。 – LWoodyiii 2010-01-18 01:16:13