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;| zanr | pocet_her |
|---|---|
| Adventura | 3 |
| Akční | 4 |
| Logická | 2 |
| RPG | 2 |
| Simulace | 2 |
| Sportovní | 2 |
| Strategie | 3 |
| 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;| zanr | nejlevnejsi | nejdrazsi |
|---|---|---|
| Adventura | 399 | 649 |
| Akční | 649 | 999 |
| Logická | 129 | 249 |
| … | … | … |
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;| zanr | nazev | pocet_her |
|---|---|---|
| Adventura | Lost Temple | 3 |
| Akční | Shadow Ninja | 4 |
| … | … | … |
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.
Jak psát:
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:
| mesto | pocet_zakazniku |
|---|---|
| NULL | 2 |
| Brno | 3 |
| Ostrava | 2 |
| Plzeň | 3 |
| Praha | 4 |
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_id | celkem |
|---|---|
| 1 | 628 |
| 2 | 899 |
| 3 | 1048 |
| 4 | 999 |
| 5 | 1698 |
| 6 | 798 |
| … | … |
Začněte programovat zdarma
5/10