Sie könnten so etwas tun. Ich habe Ihre Eingabedaten nicht, also habe ich SCOTT.EMP
verwendet stattdessen.
Beachten Sie ein paar Dinge. Ich gruppiere nach JOB
, und ich habe GROUPING(JOB)
verwendet beides in SELECT
(um das Label TOTAL
hinzuzufügen für die Zusammenfassungszeile) und in ORDER BY
. Da ich den Spaltennamen JOB
wiederverwende in SELECT
(für die Ausgabespalte), in ORDER BY
Ich muss darauf achten, den Spaltennamen JOB
zu qualifizieren (Um das klarzustellen, beziehe ich mich auf die Spalte der Eingabetabelle, nicht auf die Spalte in SELECT
- Dies wäre der Standard, wenn Spaltennamen in ORDER BY
stehen waren nicht qualifiziert). Die Notwendigkeit, Spaltennamen in ORDER BY
zu qualifizieren , zwang mich dann, die Tabelle in FROM
zu aliasen -Klausel (sonst hätte ich überall den vollständigen Tabellennamen tragen müssen).
Verwenden der GROUPING
Funktion in SELECT
(anstatt NVL
) ist besonders wichtig, wenn JOB
kann null
sein . Sie wollen die Gruppe nicht für null
Job mit TOTAL
gekennzeichnet werden - Sie wollen das nur für die Rollup-Zeile. Dieser Punkt verwirrt sogar viele sehr fortgeschrittene Programmierer.
Ich zeige, wie Sie die Reihenfolge "manuell" festlegen können:PRESIDENT
zuerst, dann MANAGER
, und dann alle anderen Jobs (in alphabetischer Reihenfolge). Wenn Sie die Prioritätsreihenfolge irgendwo gespeichert haben, zum Beispiel in einer Tabelle, können Sie mit dieser Tabelle verknüpfen und die Sortierspalte anstelle des "manuellen" CASE
verwenden Ausdruck in meiner Abfrage.
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