合計と小計を一緒に求めるSQL
「GROUP BY」句と「SUM」関数を使用すれば簡単にグループごとの小計が求めることができるのは想像できると思います。以下のテーブルとデータを使って確認してみましょう。
year | month | price |
---|---|---|
2019 | 1 | 100 |
2019 | 1 | 200 |
2019 | 2 | 300 |
2019 | 3 | 400 |
2019 | 3 | 500 |
2019 | 4 | 600 |
--テーブル作成 CREATE TABLE test_table ( year VARCHAR2(8) ,month VARCHAR2(4) ,price NUMBER ); --データ作成 INSERT ALL INTO test_table VALUES('2019', '1', 100) INTO test_table VALUES('2019', '1', 200) INTO test_table VALUES('2019', '2', 300) INTO test_table VALUES('2019', '3', 400) INTO test_table VALUES('2019', '3', 500) INTO test_table VALUES('2019', '4', 600) SELECT * FROM dual; --小計を求めるSQL SELECT year, month, SUM(price) FROM test_table GROUP BY year, month ORDER BY year, month;
月ごとの「price」の小計を取得しています。
SQL> SELECT year, month, SUM(price) 2 FROM test_table 3 GROUP BY year, month 4 ORDER BY year, month; YEAR MONTH SUM(PRICE) ---------------- -------- ---------- 2019 1 300 2019 2 300 2019 3 900 2019 4 600
上記の例で一緒に「year」の合計も一緒に取得したいって時ありませんか?そんなときは「UNION ALL」で合計を個別に求めてくっつければOKです。
SELECT '2019' AS year, '合計' AS month, SUM(price) FROM test_table UNION ALL SELECT year, month, SUM(price) FROM test_table GROUP BY year, month ORDER BY year, month;
SQL> SELECT '2019' AS year, '合計' AS month, SUM(price) 2 FROM test_table 3 UNION ALL 4 SELECT year, month, SUM(price) 5 FROM test_table 6 GROUP BY year, month 7 ORDER BY year, month; YEAR MONTH SUM(PRICE) ---------------- ------------ ---------- 2019 1 300 2019 2 300 2019 3 900 2019 4 600 2019 合計 2100
上記みたいにUNIONで個別に集計してくっつけてしまう方法もありますが、Oracleには「GROUP BY」句の拡張で「ROLLUP」という構文を用意していてこの「ROLLUP」を使用することにより簡単に合計を求めることができます。
コメント