3. 集計行の追加
集計行の追加は、model
句の代表的な使い道の1つです。Oracle 9iまでは行の追加は、union all
、rollup
、grouping sets
、連番表とのクロスジョイン、表関数などを使って行われてましたが、Oracle 10gからはmodel
句で行の追加が行えます。サンプルを見てみましょう。
ID | Val |
1 | 30 |
2 | 100 |
3 | 50 |
4 | 300 |
集計行も表示してみましょう。
select ID,Val from addTotal model dimension by(ID) measures(Val) rules( Val[null] = Val[1]+Val[2]+Val[3]+Val[4]);
ID | Val |
1 | 30 |
2 | 100 |
3 | 50 |
4 | 300 |
null | 480 |
model
句を使わない方法としては、rollup
を使う方法や、union all
を使う方法があります。
select ID,sum(Val) as Val from addTotal group by rollup(ID);
select ID,Val from addTotal union all select null,Sum(Val) from addTotal;
前問をアレンジして、今度はIDが3または4の行のみを集計対象として、集計行を表示してみましょう。
select ID,Val from addTotal model dimension by(ID) measures(Val) rules( Val[null] = Val[3]+Val[4]);
ID | Val |
1 | 30 |
2 | 100 |
3 | 50 |
4 | 300 |
null | 350 |
SQLのイメージは、下のようになります。dimension by(ID)
に対応する配列の添字を紫色でイメージしてます。
model
句を使わない方法としては、rollup
を使う方法やunion all
を使う方法がありますが、上記のSQLと比較すると、model
句による行の追加は、他の方法と比べてシンプルになることが多いと分かります。
select ID, case grouping(ID) when 0 then sum(Val) else sum(case when ID in(3,4) then Val end) end as Val from addTotal group by rollup(ID);
select ID,Val from addTotal union all select null,Sum(Val) from addTotal where ID in(3,4);
最後に
今回は、Hello Worldなどのmodel
句のサンプルと、集計行の追加を行う方法を扱いました。次回は、all_objectsやall_catalogやdictの代用や、空き番号一覧の作成を扱います。
参考資料
- 『Oracle Database 10g の SQL MODEL句』
Oracleが公開している
model
句に関する解説書です。(PDF) - 『モデリングのSQL』
Oracleの公式マニュアルの
model
句に関する説明です。 - 『モデル式』
Oracleの公式マニュアルの
model
句に関する説明です。