四半期別の集計値を求める(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.