こんにちは私はSQLピボットを初めて使用します
プログラムのカテゴリに基づいて複数の列(Q1、Q2、Q3、Q4)に基づいてデータをピボットする必要がある場合、異なる要件があります。どうすればこれを達成できますか?
すべての例は、単一の列に基づいています(例:SUM(Q1)FOR CategoryID IN([People]、[IT]、[Travel])
Q1、Q2、Q3、Q4に基づいてピボットするにはどうすればよいですか?
入力
出力
こんにちは私はSQLピボットを初めて使用します
プログラムのカテゴリに基づいて複数の列(Q1、Q2、Q3、Q4)に基づいてデータをピボットする必要がある場合、異なる要件があります。どうすればこれを達成できますか?
すべての例は、単一の列に基づいています(例:SUM(Q1)FOR CategoryID IN([People]、[IT]、[Travel])
Q1、Q2、Q3、Q4に基づいてピボットするにはどうすればよいですか?
入力
出力
希望する結果を得るには、UNPIVOT
とPIVOT
関数の両方を適用する必要があります。
unpivot関数は、、、、および列を行Q1
に変換します。それが完了したら、ピボット機能を適用します。Q2
Q3
Q4
ピボット解除コードは次のようになります。
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
SQL FiddlewithDemoを参照してください。これにより、次の結果が得られます。
| PROGRAMID | CAT_COL | VALUE |
----------------------------------
| 366 | Q1_People | 109034 |
| 366 | Q2_People | 25418 |
| 366 | Q3_People | 101130 |
| 366 | Q4_People | 54787 |
このクエリは、カテゴリ値と四半期名を持つピボットする新しい列名を作成することがわかります。
この結果が得られたら、ピボット関数を適用できます。
select *
from
(
select programid,
col + '_'+ category cat_col,
value
from yourtable
unpivot
(
value
for col in (Q1, Q2, Q3, Q4)
) unpiv
) d
pivot
(
sum(value)
for cat_col in (Q1_People, Q2_People, Q3_People, Q4_People,
Q1_IT, Q2_IT, Q3_IT, Q4_IT,
Q1_Travel, Q2_Travel, Q3_Travel, Q4_Travel)
) piv
SQL FiddlewithDemoを参照してください。これにより、次の結果が得られます。
| PROGRAMID | Q1_PEOPLE | Q2_PEOPLE | Q3_PEOPLE | Q4_PEOPLE | Q1_IT | Q2_IT | Q3_IT | Q4_IT | Q1_TRAVEL | Q2_TRAVEL | Q3_TRAVEL | Q4_TRAVEL |
---------------------------------------------------------------------------------------------------------------------------------------------
| 366 | 109034 | 25418 | 101130 | 54787 | 0 | 0 | 0 | 0 | 1195 | 613 | 1113 | 1195 |