Problem:
Chcesz znaleźć grupy wierszy, w których średnia wartości w kolumnie jest wyższa lub niższa od podanej wartości.
Przykład:
Nasza baza danych zawiera tabelę o nazwie product
z danymi w następujących kolumnach:id
, name
, grocery
i price
.
id | imię | spożywczy | cena |
---|---|---|---|
1 | mleko | Zielony Sklep | 2,34 |
2 | chleb | Sklep spożywczy Clarka | 3,56 |
3 | chleb | Supermarket | 4,15 |
4 | mleko | Supermarket | 1,80 |
5 | chleb | Sklep spożywczy Amanda | 2.26 |
6 | mleko | Fioletowy sklep spożywczy | 3,45 |
7 | mleko | Sklep spożywczy Clarka | 2.10 |
8 | chleb | Fioletowy sklep spożywczy | 2,55 |
9 | mleko | Sklep spożywczy Amanda | 1,95 |
Znajdźmy nazwy produktów, w których średnia cena każdego produktu wśród artykułów spożywczych jest wyższa niż 3,00.
Rozwiązanie:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Oto wynik:
nazwa | średnia |
---|---|
chleb | 3,13 |
Dyskusja:
Aby filtrować rekordy za pomocą funkcji agregującej, użyj klauzuli HAVING.
Tutaj obliczamy łączną wartość:średnią cenę każdego produktu. Jeden jest sprzedawany przez więcej niż jednego sklepu spożywczego; dlatego dla każdego obliczana jest średnia cena (w naszym przykładzie SELECT name, AVG(price)
). Oprócz funkcji agregującej używamy również nazwy kolumny w SELECT, więc powinniśmy użyć GROUP BY z tą nazwą kolumny (GROUP BY name
).
Ostatnim krokiem jest użycie funkcji agregującej w klauzuli HAVING. Pamiętaj, że HAVING należy umieścić po klauzuli GROUP BY. Zawiera warunek porównujący wartość zwracaną przez funkcję agregującą z podaną wartością. Powyżej jest to średnia cena produktu o wartości 3,00 (HAVING AVG(price)>3.00
). W tym zapytaniu sprawdzamy, czy średnia cena każdego produktu we wszystkich artykułach spożywczych jest wyższa niż trzy. Zapytanie wyświetliło tylko jeden produkt, chleb, o średniej cenie wyższej niż trzy.