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