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.