PIVOT句とは
『PIVOT』は軸になるとか中心になるとかいう意味で、縦と横を入れ替えたり。表を見やすくするために使います。
基本形はこんな感じ
SELECT カラム名, グループ化対象列の値1, グループ化対象列の値2, ・・・ FROM テーブル名 PIVOT ( 集計関数(集計対象列) FOR グループ化対象列 IN (グループ化対象列の値1, グループ化対象列の値2, ・・・) ) AS 別名
実際にやってみます。
準備
--テーブルの準備 CREATE TABLE 売上 ( 日付 date ,商品 varchar(20) ,金額 int ); --データの準備 INSERT INTO 売上 VALUES ('2020/7/1', 'みかん', 100 ) ; INSERT INTO 売上 VALUES ('2020/7/1', 'みかん', 200 ) ; INSERT INTO 売上 VALUES ('2020/7/1', 'バナナ', 300 ) ; INSERT INTO 売上 VALUES ('2020/7/2', 'みかん', 100 ) ; INSERT INTO 売上 VALUES ('2020/7/2', 'バナナ', 300 ) ; INSERT INTO 売上 VALUES ('2020/7/3', 'みかん', Null ) ; INSERT INTO 売上 VALUES ('2020/7/3', 'バナナ', 0 ) ; INSERT INTO 売上 VALUES ('2020/7/3', 'みかん' , 100 ) ; INSERT INTO 売上 VALUES ('2020/7/3', 'もも' , 20 ) ; INSERT INTO 売上 VALUES ('2020/7/3', 'もも' , 10 ) ; INSERT INTO 売上 VALUES ('2020/7/4', 'みかん' , 1000 ) ; SELECT * FROM 売上 ORDER BY 日付,商品
日付 | 商品 | 金額 |
2020/7/1 | バナナ | 300 |
2020/7/1 | みかん | 100 |
2020/7/1 | みかん | 200 |
2020/7/2 | バナナ | 300 |
2020/7/2 | みかん | 100 |
2020/7/3 | バナナ | 0 |
2020/7/3 | みかん | 100 |
2020/7/3 | みかん | NULL |
2020/7/3 | もも | 20 |
2020/7/3 | もも | 10 |
2020/7/4 | みかん | 1000 |
日付と商品と金額を持つ売上テーブルです。
日付別に商品がいくら売れたかを求めたい
集計関数のSUM関数を使います。
SELECT 日付,商品,SUM(金額) AS 金額 FROM 売上 GROUP BY 日付,商品 ORDER BY 日付,商品
2020/7/1 | バナナ | 300 |
2020/7/1 | みかん | 300 |
2020/7/2 | バナナ | 300 |
2020/7/2 | みかん | 100 |
2020/7/3 | バナナ | 0 |
2020/7/3 | みかん | 100 |
2020/7/3 | もも | 30 |
2020/7/4 | みかん | 1000 |
まあ欲しい情報ではあるんですが、見にくい…。
ってことでPIVOT句を使って縦と横を並べかえつつ集計もして見やすくします。
SELECT 商品 ,[2020/7/1] AS [7/1] ,[2020/7/2] AS [7/2] ,[2020/7/3] AS [7/3] ,[2020/7/4] AS [7/4] ,[2020/7/5] AS [7/5] FROM 売上 PIVOT ( SUM( 金額 ) FOR 日付 IN ([2020/7/1], [2020/7/2], [2020/7/3], [2020/7/4], [2020/7/5])) AS ピボットテーブル ORDER BY 商品 ;
商品 | 7/1 | 7/2 | 7/3 | 7/4 | 7/5 |
バナナ | 300 | 300 | 0 | NULL | NULL |
みかん | 300 | 100 | 100 | 1000 | NULL |
もも | NULL | NULL | 30 | NULL | NULL |
売上のない日も表示されるので、分かりやすいですね。
コメント