本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)
月別の集計値を求める
今回は集計時に使用すると便利な関数にターゲットを絞って解説します。集計時に使用される関数には
- AVG ― 平均値を求める
- MAX ― 最大値を求める
- MIN ― 最小値を求める
- SUM ― 合計値を求める
などがあります。例えば、リスト1のサンプル売り上げ表から月別の売り上げ集計を求めてみましょう。
SQL> desc sales 名前 型 ----------------------------------------- ------------------- PRODUCT_CODE NUMBER MONTH NUMBER SAL NUMBER
リスト1 サンプル売り上げ表
SQL> select month,sum(sal) from sales group by month order by 1;
MONTH SUM(SAL)
---------- ----------
1 50000
2 107200
3 160800
4 80400
5 100500
6 120600
7 93800
8 107200
9 120600
10 134000
11 147400
12 160800
リスト2 月別の集計値を求める
簡単ですね。では四半期別の売り上げ集計を求めるには、どうすればよいでしょう。
四半期別の集計値を求める(UNION ALL編)
まずいちばん簡単なのは“UNION ALL”で連結してしまう方法ではないでしょうか。UNION ALLは2つ以上のクエリの結果を連結する集合演算子です。
SQL> select '1Q' quarter,sum(sal) from sales
where month between 1 and 3
union all
select '2Q' quarter,sum(sal) from sales
where month between 4 and 6
union all
select '3Q' quarter,sum(sal) from sales
where month between 7 and 9
union all
select '4Q' quarter,sum(sal) from sales
where month between 10 and 12;
QUARTER SUM(SAL)
------- ----------
1Q 318000
2Q 301500
3Q 321600
4Q 442200
リスト3 UNION ALLで四半期別の集計値を求める
ただし、この場合同じSALES表に4回アクセスしていますので、効率が悪いSQL文となっています。パフォーマンス上問題になるかもしれません。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.