月別売り上げを四半期別に集計する関数ワザSQLクリニック(5)(2/3 ページ)

» 2005年06月25日 00時00分 公開
[岸本拓也株式会社インサイトテクノロジー]

四半期別の集計値を求める(DECODE編)

 “DECODE”は引数と判定値を比較し、等しい場合に結果値を返す関数です。

構文  select decode (引数,判定値1,結果値1,判定値2,結果値2,..)from ..;

SQL> select decode(deptno,10,'ACCOUNTING',
                          20,'RESEARCH',
                          30,'SALES',
                          40,'OPERATIONS') 部署名 from emp;
部署名
----------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
ACCOUNTING
SALES
SALES
RESEARCH
ACCOUNTING
リスト4 DECODE関数の簡単な使用例

 おなじみのEMP表より、DEPTNOを引数として部署名を返しています。では、リスト1のSALES表より、DECODE関数を使って四半期別の売り上げ集計値を求めてみましょう。

SQL> select
        decode(month,1,'1Q',2 ,'1Q',3 ,'1Q',
                     4,'2Q',5 ,'2Q',6 ,'2Q',
                     7,'3Q',8 ,'3Q',9 ,'3Q',
                    10,'4Q',11,'4Q',12,'4Q') quarter,
        sum(sal)
        from sales
        group by decode(month,1,'1Q',2 ,'1Q',3 ,'1Q',
                              4,'2Q',5 ,'2Q',6 ,'2Q',
                              7,'3Q',8 ,'3Q',9 ,'3Q',
                             10,'4Q',11,'4Q',12,'4Q');
QUARTER   SUM(SAL)
------- ----------
1Q          318000
2Q          301500
3Q          321600
4Q          442200
リスト5 DECODE関数を使った四半期別の売り上げ集計値

 8〜11行目のDECODE関数にてmonth列の判定を以下のように行っています。

  • 1〜3の場合  ― 1Qを結果として返し
  • 4〜6の場合  ― 2Qを結果として返し
  • 7〜9の場合  ― 3Qを結果として返し
  • 10〜12の場合 ― 4Qを結果として返し
  • group by句でQUARTER(四半期)別に集計

 UNION ALLを使用した場合と違って、SALES表へのアクセスは1回で済みます。

四半期別の集計値を求める(SIGN編)

 “SIGN”は

  • 引数が < 0 → -1
  • 引数が = 0 → 0
  • 引数が > 0 → 1

を返す関数です。

SQL> select sign(5-10),sign(5-5),sign(5-1) from dual;
SIGN(5-10)  SIGN(5-5)  SIGN(5-1)
---------- ---------- ----------
        -1          0          1
リスト6 SIGN関数の簡単な使用例

 この関数を使用して、四半期別の集計値を求めることもできます。

SQL> select   decode(sign(month- 4),-1,'1Q',
              decode(sign(month- 7),-1,'2Q',
              decode(sign(month-10),-1,'3Q','4Q'))) quarter,
              sum(sal)
     from sales
     group by decode(sign(month- 4),-1,'1Q',
              decode(sign(month- 7),-1,'2Q',
              decode(sign(month-10),-1,'3Q','4Q')));
QUARTER   SUM(SAL)
------- ----------
1Q          318000
2Q          301500
3Q          321600
4Q          442200
リスト7 SIGN関数を使った四半期別の売り上げ集計値

 DECODE関数でもいいではないかと思われるかもしれませんが、SIGN関数の大きなメリットは、以下のような場合に本領を発揮します。

SQL> select decode(sign(product_code-100),-1,'0___',
            decode(sign(product_code-200),-1,'1___',
            decode(sign(product_code-300),-1,'2___',
            decode(sign(product_code-400),-1,'3___',
            decode(sign(product_code-500),-1,'4___'))))) Code,
            sum(sal)
     from sales
     group by decode(sign(product_code-100),-1,'0___',
              decode(sign(product_code-200),-1,'1___',
              decode(sign(product_code-300),-1,'2___',
              decode(sign(product_code-400),-1,'3___',
              decode(sign(product_code-500),-1,'4___')))))
     order by 1;
CODE   SUM(SAL)
---- ----------
0___     207000
1___     227700
2___     211000
3___     385700
4___     351900
リスト8 商品コードの1けた目別に集計する

 上記の例をDECODE関数のみで実行しようとすると、すべての商品コードをDECODE関数の引数として羅列する必要があるので大変ですね。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。