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.