Oracle
 sql >> Baza danych >  >> RDS >> Oracle

sql order by z wewnętrzną klauzulą ​​select i group by rollup

Możesz zrobić coś takiego. Nie mam twoich danych wejściowych, więc użyłem SCOTT.EMP zamiast tego.

Zwróć uwagę na kilka rzeczy. Pogrupowałem według JOB i użyłem GROUPING(JOB) oba w SELECT (aby dodać etykietę TOTAL dla wiersza podsumowania) oraz w ORDER BY . Ponieważ ponownie używam nazwy kolumny JOB w SELECT (dla kolumny wyjściowej), w ORDER BY Muszę uważać, aby zakwalifikować nazwę kolumny JOB (żeby było jasne, mam na myśli kolumnę tabeli wejściowej, a nie kolumnę w SELECT - co byłoby domyślne, jeśli nazwy kolumn w ORDER BY nie zostały zakwalifikowane). Konieczność zakwalifikowania nazw kolumn w ORDER BY , następnie zmusił mnie do aliasowania tabeli w FROM klauzula (w przeciwnym razie musiałbym wszędzie nosić pełną nazwę tabeli).

Korzystanie z GROUPING funkcja w SELECT (zamiast NVL ) jest szczególnie ważne, jeśli JOB może być null . Nie chcesz, aby grupa miała null zadanie do oznaczenia TOTAL - chcesz tego tylko w wierszu podsumowania. Ten punkt dezorientuje nawet wielu bardzo zaawansowanych programistów.

Pokazuję jak można "ręcznie" zdecydować o kolejności:PRESIDENT najpierw, potem MANAGER , a następnie wszystkie inne zadania (w kolejności alfabetycznej). Jeśli masz gdzieś zapisaną kolejność priorytetów, na przykład w tabeli, możesz dołączyć do tej tabeli i użyć kolumny porządkowania zamiast "ręcznego" CASE wyrażenie w moim zapytaniu.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ROracle dbWriteTable tworzenie kolumn Oracle TIMESTAMP dla kolumn R DATE

  2. Samouczek Oracle sql:Ograniczanie zbioru danych

  3. Konwertuj liczbę na słowa w Oracle BI Publisher

  4. ORA-01618

  5. Jak zintegrować Oracle i Kafka