Anda bisa melakukan sesuatu seperti ini. Saya tidak memiliki data input Anda, jadi saya menggunakan SCOTT.EMP
sebagai gantinya.
Perhatikan beberapa hal. Saya mengelompokkan berdasarkan JOB
, dan saya menggunakan GROUPING(JOB)
keduanya di SELECT
(untuk menambahkan label TOTAL
untuk baris ringkasan) dan di ORDER BY
. Karena saya menggunakan kembali nama kolom JOB
di SELECT
(untuk kolom keluaran), di ORDER BY
Saya harus berhati-hati untuk memenuhi syarat nama kolom JOB
(untuk memperjelas saya mengacu pada kolom tabel input, bukan ke kolom di SELECT
- yang akan menjadi default jika nama kolom di ORDER BY
tidak memenuhi syarat). Kebutuhan untuk memenuhi syarat nama kolom di ORDER BY
, kemudian, memaksa saya untuk membuat alias tabel di FROM
klausa (jika tidak, saya harus membawa nama tabel lengkap di mana-mana).
Menggunakan GROUPING
fungsi di SELECT
(bukan NVL
) sangat penting jika JOB
bisa null
. Anda tidak ingin grup untuk null
pekerjaan yang akan diberi label TOTAL
- Anda hanya menginginkan itu untuk baris rollup. Poin ini bahkan membingungkan banyak programmer yang sangat mahir.
Saya tunjukkan bagaimana Anda dapat "secara manual" memutuskan pesanan:PRESIDENT
pertama, lalu MANAGER
, dan kemudian semua pekerjaan lain (diurutkan berdasarkan abjad). Jika Anda memiliki urutan prioritas yang disimpan di suatu tempat, misalnya dalam sebuah tabel, Anda dapat bergabung ke tabel itu dan menggunakan kolom pemesanan alih-alih CASE
"manual" ekspresi dalam kueri saya.
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