Filtrování skupin: HAVING
Které žánry mají aspoň 3 hry? Řádky filtruje WHERE, tak byste to mohli zkusit takhle:
SELECT zanr, COUNT(*) AS pocet_her
FROM hry
WHERE COUNT(*) >= 3
GROUP BY zanr;Error on line 1: misuse of aggregate: COUNT()Databáze si stěžuje, že COUNT je tam, kam nepatří (misuse = nesprávné použití). WHERE kontroluje řádky jeden po druhém dřív, než se seskupí, a v tu chvíli ještě není co počítat. Na filtrování skupin má SQL HAVING (mající). Píše se hned za GROUP BY a jeho podmínka se kontroluje pro každou skupinu, až když jsou agregační funkce spočítané:
SELECT zanr, COUNT(*) AS pocet_her
FROM hry
GROUP BY zanr
HAVING COUNT(*) >= 3
ORDER BY zanr;| zanr | pocet_her |
|---|---|
| Adventura | 3 |
| Akční | 4 |
| Strategie | 3 |
Skupiny, které podmínku nesplňují, ve výsledku nebudou. V HAVING můžete použít všechno, co znáte z WHERE: porovnání, AND, OR, NOT, BETWEEN… a agregační funkce, i takové, které v SELECT nejsou. Tohle jsou žánry, jejichž hry stojí v průměru nejvýš 600 Kč:
SELECT zanr
FROM hry
GROUP BY zanr
HAVING AVG(cena) <= 600
ORDER BY zanr;| zanr |
|---|
| Adventura |
| Logická |
| Simulace |
| Závodní |
Části dotazu se píšou v tomto pořadí: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.
Typická chyba: WHERE místo HAVING, jako v prvním dotazu. Kdykoli je v podmínce agregační funkce, patří podmínka do HAVING.
Jak psát:
Pokyny
Ukažte zákazníky, kteří zadali aspoň 3 objednávky: zakaznik_id a počet jejich objednávek ve sloupci pocet_objednavek, seřazené podle zakaznik_id:
| zakaznik_id | pocet_objednavek |
|---|---|
| 1 | 4 |
| 2 | 3 |
| 3 | 4 |
| 4 | 3 |
| 6 | 3 |
Pod tím ukažte objednávky za víc než 1 599 Kč: objednavka_id a součet pocet * cena ve sloupci celkem, od nejdražší, a objednávky se stejnou cenou podle objednavka_id:
| objednavka_id | celkem |
|---|---|
| 11 | 2198 |
| 14 | 1998 |
| 5 | 1698 |
| 25 | 1698 |
| 10 | 1648 |
A hry, které mají aspoň 2 recenze a v průměru aspoň 4 hvězdičky: hra_id, počet recenzí ve sloupci pocet_recenzi a průměrný počet hvězdiček zaokrouhlený na 2 desetinná místa ve sloupci prumer_hvezdicek, seřazené podle hra_id:
| hra_id | pocet_recenzi | prumer_hvezdicek |
|---|---|---|
| 1 | 4 | 4.25 |
| 3 | 2 | 4.5 |
| 6 | 2 | 4.0 |
| 7 | 2 | 4.5 |
| 10 | 2 | 4.5 |
| 15 | 2 | 4.5 |
Začněte programovat zdarma
8/10