10.11.2012, Vladimír Klaus, navštíveno 14148x

MS Access
SQL

Tento příkaz umožňuje definování podmínky, podobně jako to umožňuje příkaz WHERE. Jeho nasazení je nutné, pokud chcete mít v podmínce výsledek nějaké agregační funkce.

Dejme tomu, že si chceme udělat malou statistiku – kteří zákazníci a za kolik u nás objednali. To není nic složitého – seskupíme je podle jejich Id a v těchto skupinách zjistíme počet a součet.

SELECT IdZakaznika, COUNT(Castka), SUM(Castka)
FROM Objednavky
GROUP BY IdZakaznika

SQL obrázek

Dotaz nyní upravíme tak, abychom si vypsali pouze takové zákazníky, kteří u nás objednali celkově za více než 5000 Kč. Kromě toho do dotazu doplníme pojmenování výsledku agregačních funkcí pomocí aliasů.

SELECT IdZakaznika, COUNT(Castka) AS Pocet, SUM(Castka) AS Celkem
FROM Objednavky
GROUP BY IdZakaznika
HAVING SUM(Castka) > 5000

SQL obrázek

Za pozornost stojí také to, že za HAVING musíte zopakovat agregační funkci, nikoliv její alias. Toto tedy nebude fungovat! Více informací v části Sloupcové aliasy.

SELECT IdZakaznika, COUNT(Castka) AS Pocet, SUM(Castka) AS Celkem
FROM Objednavky
GROUP BY IdZakaznika
HAVING Celkem > 5000

V dalším příkladu si vypíšeme všechna města, ve kterých máme více než jednoho zákazníka

SELECT Mesto, COUNT(Id) AS Pocet
FROM Zakaznici
GROUP BY Mesto
HAVING COUNT(Id) > 1

SQL obrázek

Do příkazu HAVING můžeme dát více podmínek a do dotazu můžeme dokonce přidat i podmínku pomocí WHERE, jak ilustruje poslední příklad. Chceme zjistit zákazníky, kteří si během srpna objednali celkem za 1001 – 2000 Kč.

V první části se provede filtr na objednávky, které jsou ze srpna, právě pomocí klasického WHERE. Pak musíme seskupit dle zákazníka, aby se dal provést součet částek. A na závěr provedeme filtr právě těchto celkových částek.

SELECT IdZakaznika, SUM(Castka) AS CelkemZaSrpen
FROM Objednavky
WHERE Datum >= #08/01/2012# AND Datum <= #08/31/2012#
GROUP BY IdZakaznika
HAVING SUM(Castka) > 1000 AND SUM(Castka) <= 2000

SQL obrázek

Poznámka: V příkazu HAVING je teoreticky možné napsat podmínku na hodnotu přímo ve sloupci (bez agregační funkce), ovšem tu doporučujeme vložit do příkazu WHERE.