次はレポート関数を利用して、分析してみましょう。レポート関数を使用して、総売り上げに対する各店舗の売り上げ比率やマーケットシェアの計算などを行うことができます。
今回は、レポート関数を簡単に理解してもらうために、RATIO_TO_REPORT関数を例に説明します。RATIO_TO_REPORT関数は、グループ(値の集合)の合計に対する値(各行)の割合を計算します。構文は、以下になります。
構文 RATIO_TO_REPORT ( expr )OVER ( [query_partition_clause] )
では、実際にRATIO_TO_REPORT関数を使用して分析してみます。ここでもSCOTTユーザーが所有するEMP表を使ってやってみます(EMP表のスキーマ定義は前ページのリスト1を参照)。RATIO_TO_REPORT関数を使用して、全員の給料の合計に対する各従業員給料の割合を見てみましょう。
SQL> select ename, sal, sum(sal) over() as total_sal , ratio_to_report(sal) over() as ratio_sal from emp order by sal ; ENAME SAL TOTAL_SAL RATIO_SAL ---------- ---------- ---------- ---------- SMITH 800 29025 .027562446 JAMES 950 29025 .032730405 ADAMS 1100 29025 .037898363 WARD 1250 29025 .043066322 MARTIN 1250 29025 .043066322 MILLER 1300 29025 .044788975 TURNER 1500 29025 .051679587 ALLEN 1600 29025 .055124892 CLARK 2450 29025 .084409991 BLAKE 2850 29025 .098191214 JONES 2975 29025 .102497847 SCOTT 3000 29025 .103359173 FORD 3000 29025 .103359173 KING 5000 29025 .172265289 14行が選択されました。
リスト3では分析対象のグループをEMP表全体とし、全員の給料の合計に対する各従業員給料の割合をRATIO_TO_REPORT関数を使用して分析してみました。
RATIO_TO_REPORT関数を使用して、いろいろな割合を求めてみましょう。次は、職種(JOB)ごとの給料合計に対する各従業員給料の割合を見てみましょう。
SQL> select job, ename, sal , sum(sal) over(partition by job) as total_sal , ratio_to_report(sal) over(partition by job) as ratio_sal from emp order by job, sal ; JOB ENAME SAL TOTAL_SAL RATIO_SAL --------- ---------- ---------- ---------- ---------- ANALYST SCOTT 3000 6000 .5 ANALYST FORD 3000 6000 .5 CLERK SMITH 800 4150 .192771084 CLERK JAMES 950 4150 .228915663 CLERK ADAMS 1100 4150 .265060241 CLERK MILLER 1300 4150 .313253012 MANAGER CLARK 2450 8275 .296072508 MANAGER BLAKE 2850 8275 .344410876 MANAGER JONES 2975 8275 .359516616 PRESIDENT KING 5000 5000 1 SALESMAN WARD 1250 5600 .223214286 SALESMAN MARTIN 1250 5600 .223214286 SALESMAN TURNER 1500 5600 .267857143 SALESMAN ALLEN 1600 5600 .285714286 14行が選択されました。
リスト4は分析対象のグループを職種(JOB)ごととし、各職種に属する従業員給料の割合を分析してみました。さらに、全従業員の給料合計に対する各職種(JOB)の給料合計の割合を見てみましょう(リスト5)。
SQL> select job, sum(sal) as job_total_sal , sum(sum(sal)) over() as total_sal , ratio_to_report(sum(sal)) over() as ratio_sal from emp group by job order by 2 ; JOB JOB_TOTAL_SAL TOTAL_SAL RATIO_SAL --------- ------------- ---------- ---------- CLERK 4150 29025 .142980189 PRESIDENT 5000 29025 .172265289 SALESMAN 5600 29025 .192937123 ANALYST 6000 29025 .206718346 MANAGER 8275 29025 .285099053
このようにRATIO_TO_REPORT関数を使用して、さまざまな集合に対する各行の割合を求めることができることを理解してもらえたと思います。おさらいになりますが、前回に説明した分析関数が実行される手順に示したとおり、
の順で実行されていることが上の結果より理解できるでしょう。
今回は、分析関数であるウィンドウ関数とレポート関数について説明を行いました。次回は、残りの分析関数について解説する予定です。この機会に実際に試して、さらに理解を深めてみてください。(次回に続く)
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.