図でイメージするOracle DatabaseのSQL全集

第5回 RollUp集計など
Oracle SQLの各機能をイメージ図を交えて解説

Oracle ACE
山岸 賢治(やまぎし けんじ)ACE

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ビット版)

RollUp集計とは


通常のgroup by句による集計では、総計や小計を取得できないのですが、RollUp集計やgrouping sets集計やcube集計を使うと、総計や小計を取得できます。
帳票作成のselect文でRollUp集計がよく使われます。

▲ ページTOPに戻る

RollUp集計(単数列)

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文で取得してます。

▲ ページTOPに戻る

Left Curve
図でイメージする
Oracle DatabaseのSQL全集
Right Curve