オブジェクト指向、Javaを取り入れた
新しい業界標準「SQL99」詳細解説

第一章 高度なデータ操作(3)


OLAPによる分析手順

 OLAP(On-Line Analytical Processingの略語)は、図7に示すような販売実績表のように、時間や地域や製品などを軸とする多次元データベース(図の例は三次元)を、オンラインで分析する処理のことである。日々の大量の販売実績データから販売傾向を分析して効果的な販売戦略を立案することなどに応用されているデータマイニングは、OLAPの代表的なアプリケーションの1つだ。

図7 OLAP対象の多次元データベース(販売実績表)の例

 ここでは製品の販売実績表をもとにして、SQL92で行える分析手順を想定してみよう。まず全体の売上額を調べる。次のようなSELECT文にSUM列関数を使用すれば求めることができる。

照会1:
SELECT SUM(売上額) AS 合計売上額 FROM 販売実績表;

 もし販売実績の月別推移を調べたい場合は、次のようにGROUP BY句を使用して、月単位に集約を要求するSELECT文を実行する。

照会2:
SELECT 月, SUM(売上額) AS 合計売上額
FROM 販売実績表
GROUP BY 月;

 さらに月別にどの地域で売れているのかを詳細に調べたい場合は、次のようにGROUP BY句に地域名を追加したSELECT文を実行する。

照会3:
SELECT 月, 地域名, SUM(売上額) AS 合計売上額
FROM 製品売上表
GROUP BY 月, 地域名;

 このように、大きく集約した照会1の結果から出発して、何らかの課題を見つけては順番に、かつ詳細に掘り下げながらデータを分析する手順を「ドリルダウン」と呼び、逆に詳細なデータからいろいろな次元単位に集約していく分析手順を「ロールアップ」と呼んでいる。問題は、集約したい次元単位に、そのたびごとにSELECT文を作成して実行しなければならず、結果として繰り返し同じ表を読まなければならないことである。この例でいえば、もし販売実績表が非常に大きければ分析に膨大な時間がかかり、一般に対話式の試行錯誤を繰り返しながら分析して行くようなOLAP処理は性能の観点で実用に耐えられない。そこでSQL99では、ドリルダウンしたり、ロールアップしたりするときに実行したい複数のSELECT文の結果行を1回で得ることができるような機能をGROUP BY句に追加した。それによって、効率よくOLAP分析を行うことができるようになる。その機能を以下に順番に説明する。

■ROLLUP

 月・地域・製品別に、この順番で売上額を集約して分析したい場合、GROUP BY句にROLLUPオプションを指定する。

照会4:
SELECT 月, 地域名, 製品名, SUM(売上額) AS 合計売上額
FROM 販売実績表
GROUP BY ROLLUP(月, 地域名, 製品名);

 図8に照会4の結果行を示す。 結果行の列値がナル(NULL)である列が、集約されてなくなった列であることを示している。 例えば、製品名列の値がナルになっている行の合計売上額は、月・地域別の合計売上額を示し、地域名列と製品名列がナルになっている行の合計売上額は、月別の合計売上額を示す。このように、照会4の結果行には、月・地域・製品別の売上額(元の表の行と同じ)、月・地域別に集約した合計売上額、月別に集約した合計売上額、そして全部の合計売上額といった異なる集約単位の行が含まれている。つまり、照会1と照会2と照会3で得られる全部の結果行が含まれている。

図8 ROLLUPの例

ところでその結果行がどの列で集約されているのかを知るには、列値がナルであるかどうかで判断すると述べたが、ナルを調べなくてもわかる便利なGROUPING関数が提供される。GROUPING関数の引数に指定した列が、集約されてなくなる結果行については、数値の1が返却される。結果行の例を図9に示した。

照会5:
SELECT 月, 地域名, 製品名, SUM(売上額) AS 合計売上額,
GROUPING(月) AS 月集約, GROUPING(地域名) AS 地域集約,
GROUPING(製品名) AS 製品集約,
FROM 販売実績表
GROUP BY ROLLUP(月, 地域名, 製品名);

図9 GROUPING関数の例

■CUBE

  照会4では、いわば月を大分類、地域を中分類、製品を小分類として集約したが、地域・製品別であるとか、製品・月別といった、違った組み合わせの集約を行いたい場合もあるだろう。その場合には、GROUP BY句にCUBEオプションを使用する。

照会6:
SELECT 月, 地域名, 製品名, SUM(売上額) AS 合計売上額
FROM 販売実績表
GROUP BY CUBE(月, 地域名, 製品名);

これによって月・地域・製品のすべての組み合わせの集約を1回のSELECT文によって得ることができる。図10に結果行の例を示す。

図10 CUBEの例

■GROUPING SETS

  集約単位がROLLUPでは少な過ぎるが、CUBEでは多過ぎる場合、GROUP BY句のGROUPING SETSオプションに特定の集約単位を指定することによって選択することができる。次のSELECT文は、月・製品別の合計売上額と製品・地域別の合計売上額と全体の合計売上額の3種類を求めている。 GROUPING SETSの括弧中の最後の‘()'は、全体の集約を意味している。

照会7:
SELECT 月, 地域名, 製品名, SUM(売上額) AS 合計売上額
FROM 販売実績表
GROUP BY GROUPING SETS((月, 製品名), (製品名, 地域名), ());

SQL99においてOLAPのために拡張されたGROUP BY句のROLLUPやCUBEなどは、任意の数の次元の列を指定できるので、多次元のデータベースの分析処理に対応でき、大規模なデータベースであってもごれまで以上に効率的に分析処理を行うことができる。しかしOLAPに要求される分析や統計の処理は様々であり、まだ発展段階にある。次の標準として検討されているSQL4では、さらに高度な集約の機能追加を検討している。

図11 照会7の結果行


とびら 新しい業界標準「SQL99」詳細解説

第一章 高度なデータ操作

SQL99の背景と特徴
SQL99の主な機能強化
  スキーマ定義の新機能
  データ操作と演算子の新機能
  整合性の新機能
  セキュリティ(機密保護)の新機能
  トランザクション管理の新機能
  クライアント/サーバの新機能
高度なリレーショナル操作
  共通表式 WITH句
  再帰SQL
OLAPによる分析手順
  ROLLUP
  CUBE
  GROUPING SETS
ユニオン(UNION)経由の更新
  結合(JOIN)経由の更新


第二章 柔軟さを増したデータ構造

ユーザー定義可能な新しいデータ
  新しい組込みデータ型
  真理値型(BOOLEAN型)
  配列型(ARRAY型)
LOBとは
  LOBデータ型の定義
  LOBデータ型の取り扱い
  LOBロケータの使用
  HOLD LOCATORとFREE LOCATOR
  LOBの挿入(更新)と検索方法の拡張
ユーザー定義型
  ユーザー定義DISTINCT型
ユーザー定義関数
関数のオーバーロード

オブジェクトリレーショナル
  ユーザー定義構造型と列オブジェクト
  ユーザー定義構造型と行オブジェクト
副表(サブテーブル)と継承(インヘリタンス)
  副型を持つ列オブジェクト
  行オブジェクトと経路式
オブジェクトビュー
トリガ


第三章 SQLJと今後の標準化動向

クライアント/サーバ環境のための機能強化
  ストアドプロシージャ
  新しいプロシージャ言語
静的埋め込みSQLを実現する「SQLJ」
  パフォーマンスの向上と移植性
  SQLJのコンパイル
  SQLJの記述方法
  SQLJ 対 JDBC
  イテレータの使用
  SQLデータ型としてのJavaクラス
オブジェクトリレーショナル機能の応用例
  SQL/MM全文検索(フルテキスト)
  SQL/MM地理情報(スペーシャル)
今後のSQL標準化動向
  コレクション型の拡張
  オブジェクトリレーショナル機能の拡張
  SQL/MED
  OLAP機能の拡張
  自由度が高まるデータアクセス



「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間