Du kan göra något sånt här. Jag har inte dina indata, så jag använde SCOTT.EMP
istället.
Lägg märke till några saker. Jag grupperade efter JOB
, och jag använde GROUPING(JOB)
båda i SELECT
(för att lägga till etiketten TOTAL
för sammanfattningsraden) och i ORDER BY
. Eftersom jag återanvänder kolumnnamnet JOB
i SELECT
(för utdatakolumnen), i ORDER BY
Jag måste vara noga med att kvalificera kolumnnamnet JOB
(för att göra det tydligt syftar jag på kolumnen för inmatningstabellen, inte till kolumnen i SELECT
- vilket skulle vara standard om kolumnnamn i ORDER BY
inte var kvalificerade). Behovet av att kvalificera kolumnnamn i ORDER BY
, tvingade mig sedan att alias tabellen i FROM
klausul (annars hade jag behövt bära hela tabellnamnet överallt).
Använda GROUPING
funktion i SELECT
(istället för NVL
) är särskilt viktigt om JOB
kan vara null
. Du vill inte ha gruppen för null
jobb som ska märkas TOTAL
- du vill bara ha det för rollup-raden. Denna punkt förvirrar även många mycket avancerade programmerare.
Jag visar hur du "manuellt" kan bestämma ordningen:PRESIDENT
först, sedan MANAGER
, och sedan alla andra jobb (ordnade i alfabetisk ordning). Om du har prioritetsordningen sparad någonstans, till exempel i en tabell, kan du gå med i den tabellen och använda beställningskolumnen istället för den "manuella" CASE
uttryck i min fråga.
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