MS Access - Příkaz GROUP BY

8. 11. 2012, Vladimír Klaus, přečteno 17432x

MS Access
SQL

Tento skvělý příkaz slouží ke slučování (seskupování), tedy ke zjištění unikátních hodnot v jednom sloupci, nebo případně unikátních kombinací hodnot ve více sloupcích. Od predikátu DISTINCT se liší možností použití s agregační funkcí.

Díky slučování můžete takto získat například statistické údaje. Ale popořádku. Asi si dovedete představit, jak složité by bylo v davu 1000 lidí zjistit, odkud jednotliví lidé jsou a kolik jich v daném městě celkem je. Zcela logicky se taková věc řeší tak, že se lidé rozdělí do skupin dle jednotlivých měst (získáme tím počet měst) a pak sečteme lidi v jednotlivých skupinách (získáme počet lidí v jednotlivých městech).

Zdálo by se tedy logické napsat něco takového. Ale to nelze!

SELECT Prijmeni, Mesto FROM Zakaznici GROUP BY Mesto

Poznámka: Platí jednoduché pravidlo - seznam sloupců v příkazu GROUP BY musí odpovídat seznamu sloupců v příkazu SELECT, ovšem bez sloupců s agregačními funkcemi.

Při seskupování často využíváme nějakou agregační funkci, a jak vidíte v tomto příkladu, je předchozí pravidlo splněno a dotaz bude fungovat.

SELECT COUNT(Prijmeni), Mesto FROM Zakaznici GROUP BY Mesto

SQL obrázek

Pokud se vám nelíbí, že výsledná tabulka má první sloupec pojmenovaný „Expr1000“ (záleží na databázi, takto to pojmenoval MS Access 2010), pak si můžete příkaz vylepšit zadáním názvu. Tedy v našem případě, aby se sloupec, který počítá příjmení v jednotlivých městech, jmenoval třeba „Pocet“.

SELECT COUNT(Prijmeni) AS Pocet, Mesto FROM Zakaznici GROUP BY Mesto

SQL obrázek

Jestliže jste si toho nevšimli před chvílí, nyní byste už určitě měli. Jak je možné, že u Prahy 5 je počet 0? Kdyby tam nikdo nebydlel, tak by ve výsledku takový řádek vůbec neměl figurovat. Jenomže on tam jeden člověk bydlí, bohužel nemá v tabulce zákazníků vyplněné příjmení (která tu sčítáme). A když není vyplněné, tak je tam NULL a hodnoty NULL se nedají sčítat. Více v části Co to je NULL.

Abychom se tomuto problému vyhnuli, musíme použít malý trik, pomocnou funkci NZ(). Ta nám (v tomto případě) vrátí Příjmení, ale pokud by náhodou bylo NULL, pak vrátí text "nevyplněno". A výskyt takové hodnoty se už může sčítat, takže nám dotaz bude fungovat zcela korektně.

SELECT COUNT(NZ(Prijmeni, "nevyplněno")) AS Pocet, Mesto
FROM Zakaznici GROUP BY Mesto

SQL obrázek