SQLの初心者から上級者までを広く対象読者として、Oracle SQLの各機能の典型的な使用例を、学習効率が高いと思われる順序で、SQLのイメージ図を交えて解説します。
SQLをイメージつきで理解することで、素早くイメージからSQLを考えられるようになることを目標とします。
今回は、下記のOracleのSQL文の評価順序においての、6番目のgroup by句と9番目のselect句で主に使用される、RollUp集計などについて私のSQLのイメージを解説します。
1番目 | from句 |
2番目 | where句 (結合条件) |
3番目 | start with句 |
4番目 | connect by句 |
5番目 | where句 (行のフィルタ条件) |
6番目 | group by句 |
7番目 | having句 |
8番目 | model句 |
9番目 | select句 |
10番目 | union、minus、intersectなどの集合演算 |
11番目 | order by句 |
Oracle Database 11g Release 11.2.0.1.0 (windows 32ビット版)
通常のgroup by句による集計では、総計や小計を取得できないのですが、RollUp集計やgrouping sets集計やcube集計を使うと、総計や小計を取得できます。
帳票作成のselect文でRollUp集計がよく使われます。
-- サンプルデータ作成 create table LogTable( HanbaiDay date, -- 販売日 SyouhinCode char(3), -- 商品コード MiseCode char(3), -- 店コード Suuryou Number(3), -- 数量 primary key(HanbaiDay,SyouhinCode,MiseCode)); insert into LogTable select date '2011-06-30','AAA','111', 1 from dual union all select date '2011-06-30','AAA','222', 3 from dual union all select date '2011-06-30','AAA','333', 5 from dual union all select date '2011-06-30','BBB','111', 10 from dual union all select date '2011-06-30','BBB','222', 30 from dual union all select date '2011-06-30','CCC','222', 16 from dual union all select date '2011-06-30','CCC','333',700 from dual union all select date '2011-07-01','BBB','111',100 from dual union all select date '2011-07-01','BBB','222',300 from dual union all select date '2011-07-01','CCC','111',500 from dual union all select date '2011-07-02','AAA','111', 2 from dual union all select date '2011-07-02','AAA','222', 7 from dual;
HanbaiDayごとのデータ件数とSuuryouの合計を求めてみます。
通常のgroup by句を使用したselect文では、全体行を対象とした集計結果(総計)を取得できませんが、RollUpを使用したselect文では、総計を取得できます。
-- 通常のgroup by句を使用したselect文 select HanbaiDay,count(*) as cnt, sum(Suuryou) as SumSuuryou from LogTable group by HanbaiDay order by HanbaiDay;
出力結果 HanbaiDay cnt SumSuuryou ---------- --- ---------- 2011-06-30 7 765 2011-07-01 3 900 2011-07-02 2 9
-- RollUpを使用したselect文 select HanbaiDay,count(*) as cnt, sum(Suuryou) as SumSuuryou from LogTable group by RollUp(HanbaiDay) order by HanbaiDay;
出力結果 HanbaiDay cnt SumSuuryou ---------- --- ---------- 2011-06-30 7 765 2011-07-01 3 900 2011-07-02 2 9 null 12 1674
group by句でgroup by RollUp(HanbaiDay) と指定することによって、HanbaiDayごとの集計結果と、全体行を対象とした集計結果(総計)を1つのselect文で取得してます。
![]() |
図でイメージする
Oracle DatabaseのSQL全集 |
![]() |