Mohl bys udělat něco takového. Nemám vaše vstupní data, takže jsem použil SCOTT.EMP
místo toho.
Všimněte si několika věcí. Seskupeno podle JOB
a použil jsem GROUPING(JOB)
obojí v SELECT
(pro přidání štítku TOTAL
pro souhrnný řádek) a v ORDER BY
. Protože znovu používám název sloupce JOB
v SELECT
(pro výstupní sloupec), v ORDER BY
Musím být opatrný, abych kvalifikoval název sloupce JOB
(aby bylo jasné, mám na mysli sloupec vstupní tabulky, nikoli sloupec v SELECT
- což by bylo výchozí, pokud názvy sloupců v ORDER BY
nebyli kvalifikovaní). Nutnost kvalifikovat názvy sloupců v ORDER BY
, pak mě donutil vytvořit alias tabulky v FROM
klauzule (jinak bych musel všude nosit celý název tabulky).
Pomocí GROUPING
funkce v SELECT
(spíše než NVL
) je zvláště důležité, pokud JOB
může být null
. Nechcete, aby skupina měla null
úkol, který má být označen jako TOTAL
- to chcete pouze pro řádek souhrnu. Tento bod mate i mnoho velmi pokročilých programátorů.
Ukazuji, jak můžete "ručně" rozhodnout o pořadí:PRESIDENT
nejprve, potom MANAGER
a poté všechny ostatní úlohy (seřazené abecedně). Pokud máte někde uloženo pořadí priority, například v tabulce, můžete se k této tabulce připojit a místo "manuálního" CASE
použít sloupec řazení výraz v mém dotazu.
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