Oracle 合計と小計を一緒に求めるSQL

スポンサーリンク
スポンサーリンク

合計と小計を一緒に求めるSQL

「GROUP BY」句と「SUM」関数を使用すれば簡単にグループごとの小計が求めることができるのは想像できると思います。以下のテーブルとデータを使って確認してみましょう。

yearmonthprice
20191100
20191200
20192300
20193400
20193500
20194600
--テーブル作成
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」を使用することにより簡単に合計を求めることができます。

コメント

タイトルとURLをコピーしました