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句に関する説明です。
