我確定我在這裏錯過了一些東西。如何查詢行數據作爲列?
我有一個這樣的數據集:
FK RowNumber Value Type Status 1 1 aaaaa A New 1 2 bbbbb B Good 1 3 ccccc A Bad 1 4 ddddd C Good 1 5 eeeee B Good 2 1 fffff C Bad 2 2 ggggg A New 2 3 hhhhh C Bad 3 1 iiiii A Good 3 2 jjjjj A Good
我想查詢前3結果和樞軸他們爲列,所以最終的結果集看起來是這樣的:
FK Value1 Type1 Status1 Value2 Type2 Status2 Value3 Type3 Status3 1 aaaaa A New bbbbb B Good ccccc A Bad 2 fffff C Bad ggggg A New hhhhh C Bad 3 iiiii A Good jjjjj A Good
我如何在SQL Server 2005中完成這項工作?
我一直在試圖利用這個PIVOT,但我還是很陌生與該關鍵字並不能得到它的工作就是我想要的。
SELECT * --Id, [1], [2], [3]
FROM
(
SELECT Id, Value, Type, Status
, ROW_NUMBER() OVER (PARTITION BY Id ORDER Status, Type) as [RowNumber]
FROM MyTable
) as T
PIVOT
(
-- I know this section doesn't work. I'm still trying to figure out PIVOT
MAX(T.Value) FOR RowNumber IN ([1], [2], [3]),
MAX(T.Type) FOR RowNumber IN ([1], [2], [3]),
MAX(T.Status) FOR RowNumber IN ([1], [2], [3])
) AS PivotTable;
我的實際數據集是比這更復雜一點,我需要的前10條記錄,而不是前3名,所以我不希望爲每一位簡單地做CASE WHEN RowNumber = X THEN...
。
更新
我測試了所有的答案下面,發現大部分人似乎對與較小的數據集沒有明顯的性能差異(3K左右的記錄)相同,但有運行的時候是一個細微的差別對較大數據集的查詢。
這裏是我的測試結果,使用80,000條記錄和查詢前10行中的5列,因此我的最終結果集爲50列+ Id
列。我建議你自己測試一下,以決定哪一種最適合你和你的環境。
unpivoting並重新樞轉數據的bluefoot's answer平均最快在約12秒。我也喜歡這個答案,因爲我發現它最容易閱讀和維護。
Aaron's answer和koderoid's answer都建議使用
MAX(CASE WHEN RowNumber = X THEN ...)
,並且在13秒左右時間後接近平均。使用多個
PIVOT
報表Rodney's answer平均約16秒,儘管它可能是用更少的PIVOT語句(我的測試中有5)速度更快。並且建議使用CTE和
OUTER APPLY
的Aaron's answer的前半部分是最慢的。我不知道需要多長時間才能運行,因爲我在2分鐘後取消了它,這是3k條記錄,3行和3列,而不是80k條記錄,10行和5列。
發生了什麼事與'ddddd'和'eeeee'行? – Kermit
@njk他們沒有包含在最終的結果集中,因爲我只想獲得最高的X記錄(在我的例子中,我使用3,但在我的實際查詢中我需要前10個記錄) – Rachel
什麼是選擇「前10名」的標準? – Kermit