Problem:
Musisz znaleźć wiersze, w których grupy mają sumę wartości w jednej kolumnie mniejszą niż podana wartość.
Przykład:
Nasza baza danych zawiera tabelę o nazwie company
z danymi w następujących kolumnach:id
, department
, first_name
, last_name
i salary
.
id | oddział | imię | nazwisko | wynagrodzenie |
---|---|---|---|---|
1 | marketing | Lora | Brązowy | 2300 |
2 | finanse | Jan | Jackson | 3200 |
3 | marketing | Michael | Thomson | 1270 |
4 | produkcja | Tony | Młynarz | 6500 |
5 | produkcja | Sally | Zielony | 2500 |
6 | finanse | Olivier | Czarny | 3450 |
7 | produkcja | Jeniffer | Michelin | 2800 |
8 | marketing | Jerem | Lorson | 3600 |
9 | marketing | Louis | Kowalski | 4200 |
Znajdźmy nazwy działów, w których sumy wynagrodzeń pracowników są mniejsze niż 7000.
Rozwiązanie:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Oto wynik:
dział | suma |
---|---|
finanse | 6550 |
Dyskusja:
Aby filtrować rekordy za pomocą funkcji agregującej (funkcja SUM z wcześniejszej wersji), użyj klauzuli HAVING. Aby obliczyć sumę wartości dla każdej grupy wierszy, użyj funkcji agregacji SUMA. W tym zapytaniu dział kolumn jest obliczany z sumą wszystkich wynagrodzeń jego pracowników jako grupy (oblicz ją za pomocą funkcji SUMA z pensją kolumny jako argumentem). Ponieważ obliczasz wartość dla każdej grupy wierszy (grupujemy wiersze według nazwy działu), zapytanie zawiera klauzulę GROUP BY z nazwą kolumny do grupowania wierszy (w naszym przykładzie GROUP BY department
). Ostatnim krokiem jest użycie funkcji agregującej w klauzuli HAVING. Pamiętaj, HAVING należy umieścić po klauzuli GROUP BY. HAVING zawiera warunek porównujący wartość zwracaną przez funkcję agregującą z podaną wartością. Z góry są to sumy wynagrodzeń o wartości mniejszej niż 7000 (SUM(salary)<7000
). Tutaj sprawdzamy, czy suma wynagrodzeń w każdym dziale jest niższa niż 7000. Zapytanie wyświetliło tylko jeden dział, finanse, z pensjami 6550.