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;
zanrpocet_her
Adventura3
Akční4
Strategie3

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.

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_idpocet_objednavek
14
23
34
43
63

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_idcelkem
112198
141998
51698
251698
101648

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_idpocet_recenziprumer_hvezdicek
144.25
324.5
624.0
724.5
1024.5
1524.5

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

8/10