sql >> Databáze >  >> RDS >> Oracle

sql pořadí podle s vnitřní klauzulí výběru a seskupení podle souhrnu

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



  1. Rozdělit text sloupce na řádky (extrahovat oddělovač v závorce) ORACLE SQL

  2. Vždy šifrovaný výkon:Následná akce

  3. Hromadné vkládání s textovým kvalifikátorem na SQL Server

  4. INTERSECT v MySQL