SQL Academy · Lekcja

CASE w ORDER BY i agregacjach

Warunkowe sortowanie i zliczanie

Lekcja 4 z 413 kroki

CASE w ORDER BY i agregacjach to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Sortowanie według niestandardowego priorytetu

Klauzula ORDER BY w SQL zwykle sortuje wiersze według naturalnej wartości kolumny. Można jednak umieścić wyrażenie CASE wewnątrz ORDER BY, aby utworzyć całkowicie niestandardową kolejność sortowania — taką, której żadna pojedyncza kolumna nie mogłaby zapewnić.

Technika ta jest przydatna, gdy o priorytecie decydują reguły biznesowe, a nie surowe wartości danych.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

Jak działa CASE wewnątrz ORDER BY

Gdy baza danych analizuje ORDER BY CASE ... END, oblicza dla każdego wiersza liczbę całkowitą (lub inną wartość, którą można porównywać). Następnie wiersze są sortowane według tej obliczonej wartości zamiast surowej kolumny albo dodatkowo względem niej.

Wyrażenie CASE nie jest zapisywane — istnieje tylko przez czas wykonywania zapytania.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

Jawne sortowanie wartości NULL

Domyślnie różne bazy danych umieszczają wartości NULL na początku lub na końcu posortowanego wyniku w różny sposób. CASE w ORDER BY pozwala dokładnie określić miejsce wartości NULL — niezależnie od używanego silnika bazy danych.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

Warunkowe sortowanie rosnące i malejące

CASE w ORDER BY może również naśladować warunkowy kierunek sortowania. Przypisując kategoriom wartości ujemne, można skutecznie odwrócić kolejność sortowania dla określonych grup, zachowując zwykłą kolejność dla pozostałych.

Jest to przydatne, gdy różne typy wierszy wymagają odmiennej logiki sortowania w jednym zestawie wyników.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE wewnątrz COUNT

Wyrażenie CASE można umieścić wewnątrz funkcji agregującej, takiej jak COUNT. Sztuczka polega na zwracaniu wartości różnej od NULL dla wierszy, które mają zostać policzone, oraz wartości NULL dla wierszy, które należy pominąć — ponieważ COUNT ignoruje wartości NULL.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE wewnątrz SUM — sumy warunkowe

Umieszczenie CASE wewnątrz funkcji SUM pozwala dodawać wartości tylko wtedy, gdy warunek jest prawdziwy, a wiersze niespełniające warunku traktować jako zero. Jest to bardzo popularny wzorzec w raportach w stylu tabeli przestawnej, które rozdzielają jedną kolumnę na wiele kolumn z miarami.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

Warunkowa funkcja AVG z CASE

Ten sam wzorzec działa z funkcją AVG. Ponieważ AVG ignoruje wartości NULL, zwrócenie NULL dla wierszy, które mają zostać wykluczone, daje średnią wyłącznie dla pasujących wierszy — bez potrzeby używania podzapytania.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

Grupowanie za pomocą CASE — kategoryzowanie wierszy

Można użyć CASE na liście GROUP BY lub SELECT, aby podzielić wartości ciągłe na kategorie, a następnie agregować każdą z nich. W ten sposób kolumna liczbowa zostaje przekształcona w opisane etykietami grupy bez zmiany danych źródłowych.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

Używanie aliasu zamiast powtarzania CASE

Powtarzanie długiego wyrażenia CASE zarówno w SELECT, jak i w GROUP BY jest rozwlekłe. Niektóre bazy danych (MySQL, PostgreSQL po zastosowaniu obejść) pozwalają odwołać się do aliasu w ORDER BY, ale nie w GROUP BY. Najbezpieczniejsze przenośne rozwiązanie polega na opakowaniu zapytania w podzapytanie lub CTE i użyciu aliasu w GROUP BY zewnętrznego zapytania.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

Łączenie ORDER BY CASE z ASC / DESC

Po wyrażeniu CASE można nadal dopisać ASC lub DESC oraz dodać kolejne kolumny sortowania oddzielone przecinkami. Wynik CASE jest tylko pierwszym kluczem sortowania; kolejne kolumny rozstrzygają remisy w zwykły sposób.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

Przykład z życia — panel sprzedaży

Oto realistyczne zapytanie, które łączy agregację opartą na CASE z sortowaniem opartym na CASE. Tworzy ono podsumowanie sprzedaży dla poszczególnych regionów i porządkuje je tak, aby region o najwyższych przychodach zawsze pojawiał się pierwszy, a „Other” trafiał na koniec.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

Sprawdzenie wiedzy

Sprawdź swoją wiedzę na temat używania CASE wewnątrz ORDER BY i funkcji agregujących.

Podsumowanie lekcji

W tej lekcji poznali Państwo sposób łączenia CASE z ORDER BY i funkcjami agregującymi:

  • CASE in ORDER BY — przypisywanie wierszom niestandardowych wartości używanych do sortowania, kontrolowanie miejsca wartości NULL oraz łączenie wielu reguł sortowania w jednym zapytaniu.
  • CASE in COUNT — zwracanie wartości innej niż NULL dla wierszy, które mają zostać uwzględnione, oraz wartości NULL (jawnie lub niejawnie) dla wierszy pomijanych.
  • CASE in SUM / AVG — używanie 0 lub NULL jako wartości ELSE w celu tworzenia warunkowych sum i średnich w jednym przebiegu.
  • CASE in GROUP BY — grupowanie ciągłych lub kategorycznych wartości w nazwane przedziały na potrzeby agregacji.

Te wzorce eliminują wiele podzapytań i ułatwiają tworzenie raportów w stylu tabel przestawnych za pomocą zwykłego SQL.

Bezpłatny start

Ucz się SQL dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
46
Lekcje
183

Często zadawane pytania

Czy lekcja „CASE w ORDER BY i agregacjach” jest bezpłatna?

Tak — pełny tekst „CASE w ORDER BY i agregacjach” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „CASE w ORDER BY i agregacjach”?

Warunkowe sortowanie i zliczanie Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „CASE w ORDER BY i agregacjach”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wyrażenie CASE
  2. CASE wyszukiwane a proste
  3. Grupowanie i etykietowanie danych
  4. CASE w ORDER BY i agregacjach
← Powrót do SQL Academy