嚴格來說,對這個問題的SQL答案是「這是一個顯示問題。顯示是應用程序問題,而不是數據庫問題。」從關係角度講,這也是要求服務器打破第一範式並創建重複組,這意味着它幾乎肯定會需要跳過幾個環節,並且會有很大的侷限性。
的根據DBA「正確的方式」會做這樣的事情:
SELECT pid, id, val1, val2, val3
FROM Table
ORDER BY pid, id;
然後,在你的應用程序,走過你的結果集,當你需要它格式化輸出。
你甚至可以包括對pid
內的每個id
命令,也許使它更容易一點:
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
ORDER BY pid, id;
但是,讓我們說你不能這樣做。
如果你絕對有用SQL做到這一點(例如,您的報告軟件不能處理這種事情,這是你要做的),你知道你永遠不會有超過3 id
每個pid
,你可以嘗試這樣的事:
;WITH Table_id_ordered AS (
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
)
SELECT t1.pid,
t1.id as id_1,
t1.val1 as val1_1,
t1.val2 as val2_1,
t1.val3 as val3_1,
t2.id as id_2,
t2.val1 as val1_2,
t2.val2 as val2_2,
t2.val3 as val3_2,
t3.id as id_3,
t3.val1 as val1_3,
t3.val2 as val2_3,
t3.val3 as val3_3
FROM Table_id_ordered t1
LEFT JOIN Table_id_ordered t2
ON t2.pid = t1.pid
AND t2.id_order = t1.id_order + 1
LEFT JOIN Table_id_ordered t3
ON t3.pid = t2.pid
AND t3.id_order = t2.id_order + 1
WHERE t1.id_order = 1;
顯然,這只是對多達三個id
任何pid
好。正如所寫的,它也不會告訴你表中的id
是否在第五位或第五位。他們完全沒有結果。我提到的第一種方法將始終返回所有數據,並且可以編寫應用程序來輕鬆處理。
對於pid
,可以創建動態解決方案以完成任意數量的id
,但這些要複雜得多。
爲什麼是第二排的結果呢? – 2015-03-31 15:50:45
@GiorgiNakeuri sry,結果第二排是錯誤的。 – hunt3r87 2015-04-01 08:54:27