Problem:
Chcesz znaleźć grupy wierszy z określoną liczbą wpisów w grupie.
Przykład:
Nasza baza danych zawiera tabelę o nazwie product
z danymi w następujących kolumnach:id
, name
i category
.
id | imię | kategoria |
---|---|---|
1 | sofa | meble |
2 | rękawiczki | odzież |
3 | Koszulka | odzież |
4 | krzesło | meble |
5 | biurko | meble |
6 | oglądaj | elektronika |
7 | fotel | meble |
8 | spódnica | odzież |
9 | odbiornik radiowy | elektronika |
Znajdźmy kategorię produktów z więcej niż dwoma wpisami.
Rozwiązanie:
SELECT category, COUNT(id) FROM product GROUP BY category HAVING COUNT(id)>2;
Oto wyniki:
kategoria | liczba |
---|---|
meble | 4 |
odzież | 3 |
Dyskusja:
Aby filtrować rekordy według podanej liczby wierszy w grupie, użyj klauzuli HAVING. Filtruje wiersze za pomocą funkcji agregującej warunki, takiej jak COUNT. Najpierw w SELECT użyj nazwy kolumny lub kolumn do pogrupowania wierszy (jest to kategoria w naszym przykładzie), a następnie umieść funkcję agregującą COUNT, która zlicza liczbę rekordów w każdej grupie. Aby policzyć liczbę wierszy, użyj kolumny id, która przechowuje unikalne wartości (w naszym przykładzie używamy COUNT(id)
). Następnie użyj klauzuli GROUP BY, aby pogrupować rekordy według kolumn (GROUP BY
kategorii powyżej). Po użyciu GROUP BY do filtrowania rekordów za pomocą funkcji agregujących, takich jak COUNT, użyj klauzuli HAVING. Jest zawsze używany po klauzuli GROUP BY. W HAVING używamy warunku do porównania wartości z wartością zwróconą przez funkcję agregującą. W tym przykładzie porównujemy, czy ILE.LICZB(id) zwraca wartość wyższą niż dwa. Jeśli tak, kategoria jest zwracana z liczbą produktów.