Sdílet prostřednictvím


Použití klauzulí HAVING a WHERE ve stejném dotazu (Visual Database Tools)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 WHERE se 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 klauzuli WHERE.

  • Klauzule HAVING se pak použije na řádky v sadě výsledků. Ve výstupu dotazu se zobrazí jenom skupiny, které splňují podmínky HAVING. Klauzuli HAVING můžete použít pouze u sloupců, které se zobrazují také v klauzuli GROUP BY 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ě Kritéria vytvořit klauzule HAVING i WHERE. 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

  1. Zadejte skupiny pro váš dotaz. Podrobnosti najdete v Seskupení řádků ve výsledcích dotazu (Visual Database Tools).

  2. Pokud již není v podokně Kritéria, přidejte do něj sloupec, na kterém chcete založit podmínku WHERE.

  3. Vymažte sloupec Výstupní, pokud není datový sloupec součástí klauzule GROUP BY nebo není součástí agregační funkce.

  4. Ve sloupci Filtr zadejte podmínku WHERE. Návrhář dotazu a zobrazení přidá podmínku do klauzule HAVING příkazu SQL.

    Poznámka

    Dotaz zobrazený v příkladu pro tento postup spojí dvě tabulky, titles a publishers.

    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'
    
  5. Ve sloupci Seskupit podle vyberte Kde ze seznamu možností skupiny a souhrnu. Návrhář dotazu a zobrazení odebere podmínku z klauzule HAVING v příkazu SQL a přidá ji do klauzule WHERE.

    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;