こんにちは。
今回はSQL ServerのROLLUP句を紹介します。ROLLUP句はGROUP BYによる集計時に、同時に小計も表示することができる機能となっています。
またそのときに補助的に使う機能がGROUPING句になります。
以下の支店・顧客別の売上データを用いて説明していきます。
支店 | 顧客 | 売上 |
---|---|---|
東京支店 | a | 2,000 |
東京支店 | a | 1,200 |
東京支店 | a | 1,200 |
東京支店 | b | 3,000 |
東京支店 | b | 300 |
東京支店 | c | 7,000 |
福岡支店 | d | 700 |
福岡支店 | d | 10,000 |
福岡支店 | e | 3,000 |
福岡支店 | e | 2,000 |
大阪支店 | a | 300 |
大阪支店 | f | 4,000 |
大阪支店 | f | 1,700 |
大阪支店 | f | 2,000 |
大阪支店 | g | 100 |
大阪支店 | g | 3,000 |
●ROLLUP句
「各支店で全顧客が購入した売上の小計」を集計してみます。
GROUP BY句の中で合計したいカラム(今回は顧客)に対してROLLUP句を使うことで、通常のGROUP BYの集計に加えて、小計も表示することができます。
・コード
SELECT
支店,
顧客,
SUM(売上) as 売上
FROM
売上データ
GROUP BY
支店,
ROLLUP(顧客) ;
・出力
各支店の小計を出すことができました。
●GROUPING句
上で各支店の小計を出すことができましたが、顧客の小計部分がNULLになってしまうのが味気ないですね。
そこで顧客の小計部分に値を入れていきたいと思います。そのときに使える機能がGROUPING句になります。
GROUPING句はROLLUPで集計したカラムに対して使用すると、「小計した行に対しては1を、それ以外の行に対しては0を出力する機能」となっています。
そのため下記のようにCASE式と組み合わせて記載することで、小計した行を指定して値を入れることができます。
・コード
SELECT
支店,
CASE WHEN GROUPING(顧客)=1 THEN 支店+'小計' ELSE 顧客 END AS 顧客,
sum(売上) as 売上
FROM
売上データ
GROUP BY
支店, ROLLUP(顧客)
・出力
各支店の小計行に値を入れることができました。
以上になります。
GROUPING句は他にも、CUBE句やGROUPING SETS句と組み合わせて使うことができます。
皆さんの参考になれば幸いです!