sql >> Database >  >> RDS >> Oracle

sql order by met een inner select-clausule en group by rollup

Je zou zoiets kunnen doen. Ik heb je invoergegevens niet, dus ik heb SCOTT.EMP . gebruikt in plaats daarvan.

Let op een paar dingen. Ik heb gegroepeerd op JOB , en ik gebruikte GROUPING(JOB) beide in SELECT (om het label TOTAL toe te voegen voor de samenvattingsrij) en in ORDER BY . Aangezien ik de kolomnaam JOB opnieuw gebruik in SELECT (voor de uitvoerkolom), in ORDER BY Ik moet voorzichtig zijn om de kolomnaam JOB te kwalificeren (om het duidelijk te maken, ik verwijs naar de invoertabelkolom, niet naar de kolom in SELECT - wat de standaard zou zijn als kolomnamen in ORDER BY waren niet gekwalificeerd). De noodzaak om kolomnamen te kwalificeren in ORDER BY , dwong me toen om de tabel in de FROM . te aliasen clausule (anders had ik overal de volledige tabelnaam moeten dragen).

De GROUPING . gebruiken functie in SELECT (in plaats van NVL ) is vooral belangrijk als JOB kan null zijn . Je wilt de groep niet voor null taak die moet worden gelabeld TOTAL - dat wil je alleen voor de rollup-rij. Dit punt brengt zelfs veel zeer geavanceerde programmeurs in verwarring.

Ik laat zien hoe je "handmatig" de volgorde kunt bepalen:PRESIDENT eerst, dan MANAGER , en vervolgens alle andere taken (alfabetisch geordend). Als u de volgorde van prioriteit ergens hebt opgeslagen, bijvoorbeeld in een tabel, kunt u zich bij die tabel voegen en de bestelkolom gebruiken in plaats van de "handleiding" CASE uitdrukking in mijn vraag.

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. php sql multi bind_param

  2. Omgaan met tijden en na middernacht

  3. pdo_mysql installeren op Amazon EC2 met PHP 5.5

  4. SQL, hoe een tabelstructuur bij te werken