SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Oracleのmodel句

Oracleのmodel句(1)
――model句のサンプルと集計行の追加方法

model句の入門事項

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (683.0 B)

3. 集計行の追加

 集計行の追加は、model句の代表的な使い道の1つです。Oracle 9iまでは行の追加は、union allrollupgrouping sets、連番表とのクロスジョイン、表関数などを使って行われてましたが、Oracle 10gからはmodel句で行の追加が行えます。サンプルを見てみましょう。

addTotal
ID Val
1 30
2 100
3 50
4 300

 集計行も表示してみましょう。

model句で集計行の追加1
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を使う方法があります。

rollupで集計行の追加1
select ID,sum(Val) as Val
  from addTotal
group by rollup(ID);
union allで集計行の追加1
select ID,Val
  from addTotal
union all
select null,Sum(Val)
  from addTotal;

 前問をアレンジして、今度はIDが3または4の行のみを集計対象として、集計行を表示してみましょう。

model句で集計行の追加2
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)に対応する配列の添字を紫色でイメージしてます。

SQLのイメージ
SQLのイメージ

 model句を使わない方法としては、rollupを使う方法やunion allを使う方法がありますが、上記のSQLと比較すると、model句による行の追加は、他の方法と比べてシンプルになることが多いと分かります。

rollupで集計行の追加2
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);
union allで集計行の追加2
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の代用や、空き番号一覧の作成を扱います。

参考資料

  1. Oracle Database 10g の SQL MODEL句
    Oracleが公開しているmodel句に関する解説書です。(PDF)
  2. モデリングのSQL
    Oracleの公式マニュアルのmodel句に関する説明です。
  3. モデル式
    Oracleの公式マニュアルのmodel句に関する説明です。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Oracleのmodel句連載記事一覧
この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3091 2010/02/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング