あなたはこのようなことをすることができます。入力データがないので、SCOTT.EMP
を使用しました 代わりに。
いくつかのことに注意してください。 JOB
でグループ化しました 、GROUPING(JOB)
を使用しました SELECT
の両方 (ラベルTOTAL
を追加します 要約行の場合)およびORDER BY
。列名を再利用しているのでJOB
SELECT
で (出力列の場合)、ORDER BY
列名JOB
を修飾するように注意する必要があります (明確にするために、SELECT
の列ではなく、入力テーブルの列を参照しています。 -これは、ORDER BY
の列名の場合のデフォルトになります 資格がありませんでした)。 ORDER BY
の列名を修飾する必要がある 次に、FROM
のテーブルにエイリアスを作成するように強制しました 句(そうでなければ、完全なテーブル名をどこにでも持ち運ばなければならなかったでしょう)。
GROUPING
の使用 SELECT
の関数 (NVL
ではなく )JOB
の場合、特に重要です null
にすることができます 。 null
のグループは必要ありません ラベル付けするジョブTOTAL
-ロールアップ行にのみ必要です。この点は、非常に高度なプログラマーの多くでさえ混乱させます。
順序を「手動で」決定する方法を示します:PRESIDENT
最初にMANAGER
、次に他のすべてのジョブ(アルファベット順)。優先順位をテーブルなどのどこかに保存している場合は、そのテーブルに結合して、「手動」のCASE
の代わりに順序列を使用できます。 クエリ内の式。
select case grouping(job) when 0 then job else 'TOTAL' end as job
, sum(sal) as total_salary
from scott.emp e
group by rollup(job)
order by grouping(e.job) -- to get the total in the last row
, case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end
, e.job
;
JOB TOTAL_SALARY
--------- ------------
PRESIDENT 5000
MANAGER 8275
ANALYST 6000
CLERK 4150
SALESMAN 5600
TOTAL 29025