Oracle
 sql >> Datenbank >  >> RDS >> Oracle

sql order by mit einer inneren select-Klausel und group by rollup

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