Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
V některých případech můžete chtít vyloučit jednotlivé řádky ze skupin (pomocí klauzule WHERE) před použitím podmínky u skupin jako celku (pomocí klauzule HAVING).
Klauzule HAVING se podobá klauzuli WHERE, ale vztahuje se pouze na skupiny jako celek (to znamená na řádky v sadě výsledků představující skupiny), zatímco klauzule WHERE se vztahuje na jednotlivé řádky. Dotaz může obsahovat klauzuli WHERE i klauzuli HAVING. V takovém případě:
Klauzule
WHEREse použije jako první na jednotlivé řádky v tabulkách nebo objektech s hodnotou tabulky v podokně diagramu. Seskupí se pouze řádky, které splňují podmínky v klauzuliWHERE.Klauzule
HAVINGse pak použije na řádky v sadě výsledků. Ve výstupu dotazu se zobrazí jenom skupiny, které splňují podmínkyHAVING. KlauzuliHAVINGmůžete použít pouze u sloupců, které se také zobrazují vGROUP BYklauzuli nebo v agregační funkci.
Zadejte klauzule WHERE a HAVING u dvou spojených tabulek
Poznámka
Databáze použitá v tomto článku je databáze pubs, která je dostupná z ukázkových databází Northwind a pubs pro Microsoft SQL Server na GitHubu.
Představte si například, že připojujete titles a publishers tabulky, abyste vytvořili dotaz zobrazující průměrnou cenu knihy pro sadu vydavatelů. Chcete zobrazit průměrnou cenu pouze pro určitou sadu vydavatelů – možná jenom vydavatelé ve státě Kalifornie. A i pak chcete zobrazit průměrnou cenu pouze v případě, že je nad 10,00 USD.
První podmínku můžete vytvořit tak, že před výpočtem průměrných cen zahrnete klauzuli WHERE, která zahodí všechny vydavatele, kteří nejsou v Kalifornii. Druhá podmínka vyžaduje klauzuli HAVING, protože podmínka je založená na výsledcích seskupení a souhrnu dat. Výsledný příkaz SQL může vypadat takto:
SELECT titles.pub_id,
AVG(titles.price)
FROM titles
INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
V nástrojích Visual Database Tools aplikace SQL Server Management Studio můžete v podokně HAVING Kritéria vytvořit klauzule WHERE i . Pokud ve výchozím nastavení zadáte vyhledávací podmínku pro sloupec, podmínka se stane součástí klauzule HAVING. Podmínku ale můžete změnit na klauzuli WHERE.
Můžete vytvořit klauzuli WHERE a HAVING klauzuli zahrnující stejný sloupec. Provedete to tak, že sloupec přidáte dvakrát do podokna Kritéria, přičemž jeden případ označíte jako součást klauzule HAVING a druhý případ jako součást klauzule WHERE.
Zadání podmínky WHERE v agregačním dotazu
Zadejte skupiny pro váš dotaz. Podrobnosti najdete v části Seskupování řádků ve výsledcích dotazu (Visual Database Tools).
Pokud již není v podokně Kritéria, přidejte do něj sloupec, na kterém chcete založit podmínku
WHERE.Vymažte sloupec Výstup , pokud není datový sloupec součástí
GROUP BYklauzule nebo není součástí agregační funkce.Ve sloupci Filtr zadejte podmínku
WHERE. Návrhář dotazu a zobrazení přidá podmínku do klauzuleHAVINGpříkazu SQL.Poznámka
Dotaz zobrazený v příkladu pro tento postup spojí dvě tabulky,
titlesapublishers.V tomto okamžiku v dotazu příkaz SQL obsahuje klauzuli
HAVING:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA';Ve sloupci Seskupit podle vyberte Kde ze seznamu možností skupiny a souhrnu. Návrhář dotazu a zobrazení odebere podmínku z klauzule
HAVINGv příkazu SQL a přidá ji do klauzuleWHERE.Příkaz SQL se změní tak, aby místo toho zahrnoval klauzuli
WHERE:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;