Możesz zrobić coś takiego. Nie mam twoich danych wejściowych, więc użyłem SCOTT.EMP
zamiast tego.
Zwróć uwagę na kilka rzeczy. Pogrupowałem według JOB
i użyłem GROUPING(JOB)
oba w SELECT
(aby dodać etykietę TOTAL
dla wiersza podsumowania) oraz w ORDER BY
. Ponieważ ponownie używam nazwy kolumny JOB
w SELECT
(dla kolumny wyjściowej), w ORDER BY
Muszę uważać, aby zakwalifikować nazwę kolumny JOB
(żeby było jasne, mam na myśli kolumnę tabeli wejściowej, a nie kolumnę w SELECT
- co byłoby domyślne, jeśli nazwy kolumn w ORDER BY
nie zostały zakwalifikowane). Konieczność zakwalifikowania nazw kolumn w ORDER BY
, następnie zmusił mnie do aliasowania tabeli w FROM
klauzula (w przeciwnym razie musiałbym wszędzie nosić pełną nazwę tabeli).
Korzystanie z GROUPING
funkcja w SELECT
(zamiast NVL
) jest szczególnie ważne, jeśli JOB
może być null
. Nie chcesz, aby grupa miała null
zadanie do oznaczenia TOTAL
- chcesz tego tylko w wierszu podsumowania. Ten punkt dezorientuje nawet wielu bardzo zaawansowanych programistów.
Pokazuję jak można "ręcznie" zdecydować o kolejności:PRESIDENT
najpierw, potem MANAGER
, a następnie wszystkie inne zadania (w kolejności alfabetycznej). Jeśli masz gdzieś zapisaną kolejność priorytetów, na przykład w tabeli, możesz dołączyć do tej tabeli i użyć kolumny porządkowania zamiast "ręcznego" CASE
wyrażenie w moim zapytaniu.
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