Wynikiem realizacji kwerendy SELECT sezon, SUM(liczba_dn) FROM rezerwacje GROUP BY sezon;
na podstawie poniższej tabeli rezerwacje jest:
| rezerwacje | |
|---|---|
| sezon | liczba_dn |
| lato | 10 |
| zima | 4 |
| lato | 5 |
| zima | 6 |
| lato | 5 |
| zima | 9 |
| zima | 8 |
W tej kwerendzie kluczowe są dwa elementy: funkcja agregująca SUM oraz klauzula GROUP BY. Instrukcja SELECT sezon, SUM(liczba_dn) FROM rezerwacje GROUP BY sezon; nie wypisuje każdego rekordu osobno, tylko najpierw dzieli rekordy na grupy według wartości w kolumnie sezon, a potem dla każdej grupy sumuje wartości z kolumny liczba_dn. Dla sezonu lato mamy wartości 10, 5 i 5, więc suma wynosi 20. Dla sezonu zima mamy 4, 6, 9 i 8, więc suma wynosi 27. Wynik to więc: lato 20 oraz zima 27. Moim zdaniem to jeden z najważniejszych schematów w SQL, bo bardzo często w praktyce trzeba policzyć sprzedaż według miesięcy, liczbę rezerwacji według sezonu albo łączny czas pracy według pracownika. Dobra praktyka jest taka, żeby kolumnę z wynikiem agregacji nazywać aliasem, np. SUM(liczba_dn) AS razem_dni. Wtedy wynik jest czytelniejszy, szczególnie w aplikacjach webowych, raportach i panelach administracyjnych.
W tym zadaniu łatwo pomylić zliczanie rekordów z sumowaniem wartości, a to są dwie różne operacje w SQL. Wynik lato 3, zima 4 odpowiadałby raczej zapytaniu z funkcją COUNT, czyli policzeniu, ile wierszy występuje dla każdego sezonu. COUNT nie interesuje się tym, czy w kolumnie liczba_dn jest 10, 5 czy 8, tylko liczy rekordy. Tutaj jednak użyto SUM(liczba_dn), więc baza danych dodaje liczby dni w obrębie każdej grupy. Drugi częsty błąd to potraktowanie GROUP BY tak, jakby tylko porządkowało dane i zostawiało wszystkie wartości osobno, np. lato 10, 5, 5 oraz zima 4, 6, 9, 8. To nie jest poprawny wynik tej kwerendy, bo funkcja agregująca zwraca jedną wartość dla całej grupy, a nie listę elementów. Jeszcze inne nieporozumienie polega na przepisaniu tabeli wejściowej bez żadnej agregacji. Taki wynik byłby możliwy przy prostym SELECT sezon, liczba_dn FROM rezerwacje, ale nie wtedy, gdy używamy GROUP BY razem z SUM. W praktyce GROUP BY służy właśnie do tworzenia zestawień i raportów, a nie do zwykłego wyświetlania danych. Z mojego doświadczenia warto zawsze zadać sobie pytanie: według czego grupuję i jaką operację wykonuję na każdej grupie. Tutaj grupujemy według sezonu i sumujemy liczba_dn, więc końcowy wynik musi mieć po jednym wierszu dla każdego sezonu.