2017-11-14 7 views
1

可変数の行を1つの行にピボットするSQL文を作成しようとしています。データの小さなサブセットは、次のようになります。SQL Serverの複数の列をピボットする方法は?

+--------------+--------+-------+-------+ 
|  ID  | Flag | workD | holiD | 
+--------------+--------+-------+-------+ 
| 11155  | N  | 1  | 0  | 
| 11155  | D  | 1  | 1  | 
| 5675   | N  | 1  | 1  | 
| 98761  | N  | 0  | 1  | 
| 98761  | D  | 1  | 1  | 
+--------------+--------+-------+-------+ 

と私が見えるようにデータをピボットしたいと思います次:

+--------------+---------+---------+---------+---------+ 
|  ID  | N_wordD | N_holiD | D_wordD | D_holiD | 
+--------------+---------+---------+---------+---------+ 
| 11155  | 1  | 0  | 1  | 1  | 
| 5675   | 1  | 1  | NULL | NULL | 
| 98761  | 0  | 1  | 1  | 1  | 
+--------------+---------+---------+---------+---------+ 

私は特に、それはピボットに来るとき失われたビットスタイルと数量の両方を自分の列にピボットさせたいときに使用します。

どのような提案、ポインタなどをいただければ幸いです。

+0

が使用可能なフラグのみ 'N' と 'D' で確認されましたか? –

答えて

1

ここではピボットは必要ないと思うのではなく、ケースとグループ化を組み合わせて試してみてください。試す

WITH CTE 
AS 
(
    SELECT 
    ID, 
    N_WorkD = CASE WHEN Flag = 'N' THEN WorkD ELSE 0 END , 
    N_holiD = CASE WHEN Flag = 'N' THEN holiD ELSE 0 END, 
    D_WorkD = CASE WHEN Flag = 'D' THEN WorkD ELSE 0 END , 
    D_holiD = CASE WHEN Flag = 'D' THEN holiD ELSE 0 END 
    FROM T1 
) 
SELECT 
    ID, 
    N_WorkD = SUM(N_WorkD), 
    N_holiD = SUM(N_holiD), 
    D_WorkD = SUM(D_WorkD), 
    D_holiD = SUM(D_holiD) 
    FROM CTE 
    GROUP BY ID 

以下のサンプル結果は

Sample

以下のようにここでSQLFiddle

関連する問題