2017-12-29 19 views
0

I次の表があります。SQL Serverの(2012):ピボット(?またはグループによる)複数列に

month seating_id dept_id 
Jan  1   5 
Jan  8   9 
Jan  5   3 
Jan  7   2 
Jan  1   5 
Feb  1   9 
Feb  8   9 
Feb  5   3 
Feb  7   2 
Feb  7   1 

が、私は、各月のseating_iddept_idの各タイプをカウントするので、結果は希望を

month seating_id_1 seating_id_5 seating_id_7 seating_id_8 dept_id_1 dept_id_2 dept_id_3 dept_id_5 dept_id_9 
Jan  2    1    1    1    0   1    1    2   1 
Feb  0    1    2    1    1   1    1    0   2 

私はunpivot/pivotGROUP BYを試してきましたが、所望の結果を達成することができていない。このような何かを見て。注意してください、私は可能な場合は、PROCEDURE呼び出しではなく、SELECT文としてこれを実行したいと思います。

他の情報が必要な場合はお知らせください。

答えて

2

私はあなたが好きではないかもしれない答えを持っていますが、それはそれをしない:あなたがダイナミック

例に

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select month,B.* 
     From YourTable A 
     Cross Apply (values (concat(''seating_id_'',seating_id),seating_id) 
          ,(concat(''dept_id_'',dept_id),dept_id) 
        ) b(item,value) 
    ) A 
Pivot (count([Value]) For [Item] in (' + Stuff((Select Distinct concat(',[seating_id_',seating_id,']') from YourTable For XML Path('')),1,1,'') 
             +','+ 
             Stuff((Select Distinct concat(',[dept_id_',dept_id,']') from YourTable For XML Path('')),1,1,'') 
             + ')) p' 
Exec(@SQL); 

戻り enter image description hereに行く必要がある場合には

select month 
    , sum(case seating_id when 1 then 1 else 0 end) as seating_id_1 
    , sum(case seating_id when 2 then 1 else 0 end) as seating_id_2 
    ... 
    , sum(case dept_id when 1 then 1 else 0 end) as dept_id_1 
    , sum(case dept_id when 2 then 1 else 0 end) as dept_id_2 
    ... 
from YourTable 
group by month 
+0

のように見えるが、それは、私はすでにすべてのIDを知っていると仮定し、全く新しいものが追加されません。列ごとに利用可能なすべてのIDを反復処理する方法はありますか? IDは別のテーブル(外部キーの関係)から来て、SELECTステートメントで参照できます。 – NickBraunagel

+0

はい。しかしそれは動的である必要があります – KeithL

3

は、生成されたSQLは確かに良い答えこの

Select * 
From (
     Select month,B.* 
     From YourTable A 
     Cross Apply (values (concat('seating_id_',seating_id),seating_id) 
          ,(concat('dept_id_',dept_id),dept_id) 
        ) b(item,value) 
    ) A 
Pivot (count([Value]) For [Item] in ([seating_id_1],[seating_id_5],[seating_id_7],[seating_id_8],[dept_id_1],[dept_id_2],[dept_id_3],[dept_id_5],[dept_id_9])) p 
関連する問題