12.14 COMPUTE
構文
COMP[UTE] [function [LAB[EL] text] ... OF {expr | column | alias} ... ON {expr | column | alias | REPORT | ROW} ...]
BREAKコマンドと組み合せて、選択した行のサブセットについて、各種の標準計算方法を使用してサマリー行を計算して出力します。 すべてのCOMPUTE定義もリスト表示します。サマリーの作成方法の詳細は、間隔の設定およびサマリー行によるレポートの明確化についてを参照してください。
項
function ...
表12-2に示す関数の1つを指定します。複数の関数を指定する場合は、関数と関数の間を空白で区切ります。
COMPUTEコマンドの関数は、COMPUTEコマンド内の順序にかかわらず、常にAVG、COUNT、MINIMUM、MAXIMUM、NUMBER、SUM、STD、VARIANCEの順序で実行されます。
表12-2 COMPUTE関数
関数 | 計算 | 適用されるデータ型 |
---|---|---|
AVG |
NULL以外の値の平均 |
NUMBER |
COU[NT] |
NULL以外の値の数 |
すべての型 |
MIN[IMUM] |
最小値 |
NUMBER、CHAR、NCHAR、VARCHAR2(VARCHAR)、NVARCHAR2(NCHAR VARYING) |
MAX[IMUM] |
最大値 |
NUMBER、CHAR、NCHAR、VARCHAR2(VARCHAR)、NVARCHAR2(NCHAR VARYING) |
NUM[BER] |
行の数 |
すべての型 |
SUM |
NULL以外の値の合計 |
NUMBER |
STD |
NULL以外の値の標準偏差 |
NUMBER |
VAR[IANCE] |
NULL以外の値の平方偏差 |
NUMBER |
LAB[EL] text
計算値に対応して出力されるラベルを定義します。LABEL句を使用しない場合のデフォルトのtextは、省略されていないファンクション・キーワードです。空白または句読点を含む場合、textを一重引用符で囲む必要があります。ラベルは左揃えで出力され、列幅または行サイズのいずれか小さい方に合せて切り捨てられます。ラベルの最大長は500文字です。
計算された値のラベルは、指定したブレーク列に表示されます。ラベルを非表示にするには、ブレーク列に対して、COLUMNコマンドのNOPRINTオプションを使用します。
COMPUTEコマンドの中で同じ関数を繰り返し使用すると、SQL*Plusはアラートを発行し、そのうちの最初の関数のみを使用します。
ON REPORTおよびON ROW計算では、SELECT構文のリストに指定された最初の列にラベルが示されます。SELECT文の中で最初にNOPRINT列を使用することによって、ラベルを非表示にできます。SELECT文ON REPORTまたはON ROWの最初の列の関数を計算する場合は、計算済の値が最初の列に表示され、ラベルは表示されません。ラベルを見るには、SELECT構文のリストで最初にダミー列を選択します。
OF {expr | column | alias} ...
OF句では、式または関数の参照を二重引用符で囲むことによって、SELECT文の中の式または関数の参照を指定できます。列の名前および別名に引用符は必要ありません。
ON {expr | column | alias | REPORT | ROW} ...
複数のCOMPUTEコマンドのON句で同じ列が参照されている場合は、最後のCOMPUTEコマンドのみが適用されます。
ON句でSQL SELECT式または関数の参照を指定するには、その式または関数の参照を引用符で囲みます。列の名前および別名に引用符は必要ありません。
使用方法
計算が実行されるためには、次の条件がすべて満たされている必要があります。
-
OF句で参照している1つ以上の式、列または列の別名が、SELECT文の中でも指定されている。
-
ON句でROWまたはREPORTを参照する場合は、最新のBREAKコマンドの中でもROWまたはREPORTを参照する。
すべてのCOMPUTE定義を取り消すには、CLEAR COMPUTESコマンドを使用します。
COMPUTEが実行されている列に対してNOPRINTオプションを使用すると、COMPUTEの実行結果も非表示になります。
例
AC_MGR(アカウント・マネージャ)およびSA_MAN(セールスマン)の各職種別に給与の小計を計算し、TOTALという計算ラベルを付けるには、次のように入力します。
BREAK ON JOB_ID SKIP 1; COMPUTE SUM LABEL 'TOTAL' OF SALARY ON JOB_ID; SELECT JOB_ID, LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE JOB_ID IN ('AC_MGR', 'SA_MAN') ORDER BY JOB_ID, SALARY;
JOB_ID LAST_NAME SALARY
---------- ------------------------- ----------
AC_MGR Higgins 12000
********** ----------
TOTAL 12000
SA_MAN Zlotkey 10500
Cambrault 11000
Errazuriz 12000
Partners 13500
Russell 14000
********** ----------
TOTAL 61000
6 rows selected.
レポート上の12,000を超える給与の合計を計算するには、次のように入力します。
COMPUTE SUM OF SALARY ON REPORT BREAK ON REPORT COLUMN DUMMY HEADING '' SELECT ' ' DUMMY, SALARY, EMPLOYEE_ID FROM EMP_DETAILS_VIEW WHERE SALARY > 12000 ORDER BY SALARY;
SALARY EMPLOYEE_ID
--- ---------- -----------
13000 201
13500 146
14000 145
17000 101
17000 102
24000 100
----------
sum 98500
6 rows selected.
管理部門および経理部門の中での給与の平均と最高額を計算するには、次のように入力します。
BREAK ON DEPARTMENT_NAME SKIP 1 COMPUTE AVG LABEL 'Dept Average' - MAX LABEL 'Dept Maximum' - OF SALARY ON DEPARTMENT_NAME SELECT DEPARTMENT_NAME, LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE DEPARTMENT_NAME IN ('Executive', 'Accounting') ORDER BY DEPARTMENT_NAME;
DEPARTMENT_NAME LAST_NAME SALARY
------------------------------ ------------------------- ----------
Accounting Higgins 12000
Gietz 8300
****************************** ----------
Dept Average 10150
Dept Maximum 12000
Executive King 24000
Kochhar 17000
De Haan 17000
****************************** ----------
Dept Average 19333.3333
Dept Maximum 24000
部門20以下の給与を合計し、計算ラベルを出力しないようにするには、次のようにします。
COLUMN DUMMY NOPRINT COMPUTE SUM OF SALARY ON DUMMY BREAK ON DUMMY SKIP 1 SELECT DEPARTMENT_ID DUMMY, DEPARTMENT_ID, LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE DEPARTMENT_ID <= 20 ORDER BY DEPARTMENT_ID;
DEPARTMENT_ID LAST_NAME SALARY
------------- ------------------------- ----------
10 Whalen 4400
----------
4400
20 Hartstein 13000
20 Fay 6000
----------
19000
計算ラベルを出力せずに、レポートの終わりに給与合計額が表示されるようにするには、次のように入力します。
COLUMN DUMMY NOPRINT COMPUTE SUM OF SALARY ON DUMMY BREAK ON DUMMY SELECT NULL DUMMY, DEPARTMENT_ID, LAST_NAME, SALARY FROM EMP_DETAILS_VIEW WHERE DEPARTMENT_ID <= 30 ORDER BY DEPARTMENT_ID;
DEPARTMENT_ID LAST_NAME SALARY
------------- ------------------------- ----------
10 Whalen 4400
20 Hartstein 13000
20 Fay 6000
30 Raphaely 11000
30 Khoo 3100
30 Baida 2900
30 Tobias 2800
30 Himuro 2600
30 Colmenares 2500
----------
48300
9 rows selected.