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