私はここで何かが欠けていると確信しています。
私はこのようなデータセットを持っています:
FKRowNumber値タイプステータス 1 1 aaaaa A New 1 2bbbbbB良い 13ccccc悪い 1 4dddddC良い 1 5eeeeeB良い 2 1fffffC悪い 2 2 ggggg A New 2 3hhhhhC悪い 31iiiii良い 3 2jjjjjA良い
上位3つの結果をクエリし、それらを列としてピボットしたいので、最終結果セットは次のようになります。
FK Value1 Type1 Status1 Value2 Type2 Status2 Value3 Type3 Status3 1aaaaaA新しいbbbbbB良いcccccA悪い 2 fffff C Bad ggggg A New hhhhh C Bad 3iiiiiA良いjjjjjA良い
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;
私の実際のデータセットはこれよりも少し複雑で、上位3つではなく、上位10のレコードが必要なので、それぞれに対して単純に実行したくありませんCASE WHEN RowNumber = X THEN...
。
アップデート
以下のすべての回答をテストしたところ、ほとんど同じように見え、小さなデータセット(約3kレコード)では明らかなパフォーマンスの違いはありませんでしたが、大きなデータセットに対してクエリを実行するとわずかな違いがありました。
これは、80,000レコードを使用し、上位10行の5列をクエリしたテストの結果です。したがって、最終結果セットは50列+Id
列でした。自分でテストして、どちらが自分と環境に最適かを判断することをお勧めします。
データのピボット解除と再ピボットに関するbluefootの回答は、平均して約12秒で最速でした。読みやすく、保守しやすいので、この回答も気に入りました。
アーロンの答えとコデロイドの答えはどちらも、を使用することを示唆しており
MAX(CASE WHEN RowNumber = X THEN ...)
、平均して約13秒遅れていました。複数のステートメントを使用するというRodneyの回答
PIVOT
は、平均して約16秒でしたが、PIVOTステートメントが少ないほど高速になる可能性があります(私のテストでは5秒でした)。そして、アーロンの回答の前半は、CTEの使用を提案し
OUTER APPLY
、最も遅かった。2分後にキャンセルしたため、実行にかかる時間はわかりません。これは、80kレコード、10行、5列ではなく、約3kレコード、3行、3列でした。