Skupiny: GROUP BY

Kolik her jakého žánru obchod má? S tím, co zatím znáte, byste potřebovali dotaz pro každý žánr: WHERE zanr = 'Akční', WHERE zanr = 'Adventura' a tak dál, osmkrát. GROUP BY (seskupit podle) to zvládne jedním dotazem:

SELECT zanr, COUNT(*) AS pocet_her
FROM hry
GROUP BY zanr
ORDER BY zanr;
zanrpocet_her
Adventura3
Akční4
Logická2
RPG2
Simulace2
Sportovní2
Strategie3
Závodní2

GROUP BY zanr rozdělí řádky do skupin: všechny řádky se stejným žánrem patří do jedné skupiny. Čtyři akční hry (Shadow Ninja, Star Pilots, Zombie Town a Robot Rebellion) tvoří jednu skupinu, tři adventury další a tak dál. Agregační funkce se pak spočítá pro každou skupinu zvlášť a výsledek má pro každou skupinu jeden řádek: žánr a počet jeho her.

Takhle funguje každá agregační funkce a můžete jich použít i několik najednou:

SELECT zanr, MIN(cena) AS nejlevnejsi, MAX(cena) AS nejdrazsi
FROM hry
GROUP BY zanr
ORDER BY zanr;
zanrnejlevnejsinejdrazsi
Adventura399649
Akční649999
Logická129249
………

GROUP BY se píše za FROM a WHERE a před ORDER BY. Skupiny můžou přijít seřazené, ale nic to nezaručuje, takže když na pořadí záleží, přidejte ORDER BY. Řádky, které mají ve sloupci NULL, tvoří samostatnou skupinu.

Co může stát v SELECT vedle agregační funkce? Sloupce, podle kterých seskupujete, protože ty jsou v celé skupině stejné, a agregační funkce, které ze skupiny spočítají jednu hodnotu. Nic jiného: skupina má mnoho řádků s různými názvy, který z nich by měl výsledek ukázat?

Typická chyba: sloupec, který není v GROUP BY. Většina databází ohlásí chybu, že sloupec musí být v GROUP BY nebo uvnitř agregační funkce. SQLite ne, vezme název z jednoho řádku každé skupiny:

SELECT zanr, nazev, COUNT(*) AS pocet_her
FROM hry
GROUP BY zanr;
zanrnazevpocet_her
AdventuraLost Temple3
AkčníShadow Ninja4
………

Každý řádek teď ukazuje název jedné hry vedle počtu her celého žánru, což nedává smysl. Když uvidíte takový výsledek, zkontrolujte, že každý sloupec v SELECT je buď v GROUP BY, nebo uvnitř agregační funkce.

Pokyny

Spočítejte zákazníky v každém městě: ukažte město a počet jeho zákazníků ve sloupci pocet_zakazniku, seřazené podle města. Zákazníci bez města tvoří také skupinu:

mestopocet_zakazniku
NULL2
Brno3
Ostrava2
Plzeň3
Praha4

Pod tím spočítejte z tabulky polozky celkovou cenu každé objednávky: ID objednávky (objednavka_id) a součet pocet * cena ve sloupci celkem, seřazené podle objednavka_id:

objednavka_idcelkem
1628
2899
31048
4999
51698
6798
……

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/10