嘗試:
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
參考:
@Lwoodyiii - 我在我的回覆中發現了一個錯誤。我不認爲它會外推到6 - 建議你稍微擴展你的問題,以給出完整的圖片。 – 2010-01-18 00:28:51
@Martin我編輯它。請把你的答案備份起來,我想這可以擴展到正確的答案。我認爲這是一個有用的開始。 謝謝! – LWoodyiii 2010-01-18 00:32:53
什麼版本的SQL Server? – 2010-01-18 00:37:24