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