sql >> Databasteknik >  >> RDS >> Oracle

sql ordning efter med en inre select-sats och gruppera efter rollup

Du kan göra något sånt här. Jag har inte dina indata, så jag använde SCOTT.EMP istället.

Lägg märke till några saker. Jag grupperade efter JOB , och jag använde GROUPING(JOB) båda i SELECT (för att lägga till etiketten TOTAL för sammanfattningsraden) och i ORDER BY . Eftersom jag återanvänder kolumnnamnet JOB i SELECT (för utdatakolumnen), i ORDER BY Jag måste vara noga med att kvalificera kolumnnamnet JOB (för att göra det tydligt syftar jag på kolumnen för inmatningstabellen, inte till kolumnen i SELECT - vilket skulle vara standard om kolumnnamn i ORDER BY inte var kvalificerade). Behovet av att kvalificera kolumnnamn i ORDER BY , tvingade mig sedan att alias tabellen i FROM klausul (annars hade jag behövt bära hela tabellnamnet överallt).

Använda GROUPING funktion i SELECT (istället för NVL ) är särskilt viktigt om JOB kan vara null . Du vill inte ha gruppen för null jobb som ska märkas TOTAL - du vill bara ha det för rollup-raden. Denna punkt förvirrar även många mycket avancerade programmerare.

Jag visar hur du "manuellt" kan bestämma ordningen:PRESIDENT först, sedan MANAGER , och sedan alla andra jobb (ordnade i alfabetisk ordning). Om du har prioritetsordningen sparad någonstans, till exempel i en tabell, kan du gå med i den tabellen och använda beställningskolumnen istället för den "manuella" CASE uttryck i min fråga.

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



  1. Hur man gör en Full Outer Join i MySQL

  2. Kan inte komma åt Sequelize-instansmetoder

  3. Hur du skyddar din MySQL- eller MariaDB-databas från SQL-injektion:Del två

  4. SQL Slumpmässiga rader i en stor tabell (med where-sats)