あなたはこのようなことをすることができます。入力データがないので、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