Можеш да направиш нещо подобно. Нямам вашите входни данни, затова използвах 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