Je zou zoiets kunnen doen. Ik heb je invoergegevens niet, dus ik heb SCOTT.EMP . gebruikt in plaats daarvan.
Let op een paar dingen. Ik heb gegroepeerd op JOB , en ik gebruikte GROUPING(JOB) beide in SELECT (om het label TOTAL toe te voegen voor de samenvattingsrij) en in ORDER BY . Aangezien ik de kolomnaam JOB opnieuw gebruik in SELECT (voor de uitvoerkolom), in ORDER BY Ik moet voorzichtig zijn om de kolomnaam JOB te kwalificeren (om het duidelijk te maken, ik verwijs naar de invoertabelkolom, niet naar de kolom in SELECT - wat de standaard zou zijn als kolomnamen in ORDER BY waren niet gekwalificeerd). De noodzaak om kolomnamen te kwalificeren in ORDER BY , dwong me toen om de tabel in de FROM . te aliasen clausule (anders had ik overal de volledige tabelnaam moeten dragen).
De GROUPING . gebruiken functie in SELECT (in plaats van NVL ) is vooral belangrijk als JOB kan null zijn . Je wilt de groep niet voor null taak die moet worden gelabeld TOTAL - dat wil je alleen voor de rollup-rij. Dit punt brengt zelfs veel zeer geavanceerde programmeurs in verwarring.
Ik laat zien hoe je "handmatig" de volgorde kunt bepalen:PRESIDENT eerst, dan MANAGER , en vervolgens alle andere taken (alfabetisch geordend). Als u de volgorde van prioriteit ergens hebt opgeslagen, bijvoorbeeld in een tabel, kunt u zich bij die tabel voegen en de bestelkolom gebruiken in plaats van de "handleiding" CASE uitdrukking in mijn vraag.
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