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 také zobrazují v GROUP BY klauzuli 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

  1. Zadejte skupiny pro váš dotaz. Podrobnosti najdete v části Seskupování řá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ýstup , pokud není datový sloupec součástí GROUP BY klauzule 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;