Du kunne gøre sådan noget. Jeg har ikke dine inputdata, så jeg brugte SCOTT.EMP i stedet.
Læg mærke til et par ting. Jeg grupperede efter JOB , og jeg brugte GROUPING(JOB) begge i SELECT (for at tilføje etiketten TOTAL for oversigtsrækken) og i ORDER BY . Da jeg genbruger kolonnenavnet JOB i SELECT (for outputkolonnen), i ORDER BY Jeg skal være omhyggelig med at kvalificere kolonnenavnet JOB (for at gøre det klart henviser jeg til inputtabelkolonnen, ikke til kolonnen i SELECT - hvilket ville være standard, hvis kolonnenavne i ORDER BY ikke var kvalificerede). Behovet for at kvalificere kolonnenavne i ORDER BY tvang mig derefter til at kalde tabellen i FROM klausul (ellers ville jeg have været nødt til at bære det fulde tabelnavn overalt).
Brug af GROUPING funktion i SELECT (i stedet for NVL ) er især vigtig, hvis JOB kan være null . Du vil ikke have gruppen til null job skal mærkes TOTAL - det vil du kun have til rollup-rækken. Dette punkt forvirrer selv mange meget avancerede programmører.
Jeg viser, hvordan du "manuelt" kan bestemme rækkefølgen:PRESIDENT først, derefter MANAGER , og derefter alle andre job (ordnet alfabetisk). Hvis du har prioritetsrækkefølgen gemt et sted, for eksempel i en tabel, kan du tilslutte dig den tabel og bruge bestillingskolonnen i stedet for den "manuelle" CASE udtryk i min forespørgsel.
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