Dela via


Använda HAVING- och WHERE-satser i samma fråga (Visual Database Tools)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

I vissa fall kanske du vill exkludera enskilda rader från grupper (med hjälp av en WHERE-sats) innan du tillämpar ett villkor på grupper som helhet (med hjälp av en HAVING-sats).

En HAVING-sats är som en WHERE-sats, men gäller endast grupper som helhet (dvs. för raderna i resultatuppsättningen som representerar grupper), medan WHERE-satsen gäller för enskilda rader. En fråga kan innehålla både en WHERE-sats och en HAVING-sats. I så fall:

  • Satsen WHERE tillämpas först på de enskilda raderna i tabellerna eller tabellvärdesobjekten i diagram fönstret. Endast de rader som uppfyller villkoren i WHERE-satsen grupperas.

  • Satsen HAVING tillämpas sedan på raderna i resultatuppsättningen. Endast de grupper som uppfyller HAVING villkor visas i frågeutdata. Du kan endast använda en HAVING-sats för kolumner som också visas i GROUP BY-satsen eller i en mängdfunktion.

Ange en WHERE- och HAVING-sats för två anslutna tabeller

Not

Databasen som används i den här artikeln är den pubs databasen som är tillgänglig från Northwind och pubs-exempeldatabaser för Microsoft SQL Server- på GitHub.

Anta till exempel att du ansluter till tabellerna titles och publishers för att skapa en fråga som visar det genomsnittliga bokpriset för en uppsättning utgivare. Du vill bara se genomsnittspriset för en viss uppsättning utgivare – kanske bara utgivare i delstaten Kalifornien. Och även då vill du bara se det genomsnittliga priset om det är över $ 10,00.

Du kan upprätta det första villkoret genom att inkludera en WHERE-sats, som tar bort alla utgivare som inte finns i Kalifornien, innan du beräknar genomsnittliga priser. Det andra villkoret kräver en HAVING-sats, eftersom villkoret baseras på resultatet av gruppering och sammanfattning av data. Den resulterande SQL-instruktionen kan se ut så här:

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;

I Visual Database Tools i SQL Server Management Studio kan du skapa både HAVING- och WHERE-satser i fönstret Villkor. Om du som standard anger ett sökvillkor för en kolumn blir villkoret en del av HAVING-satsen. Du kan dock ändra villkoret till en WHERE-sats.

Du kan skapa en WHERE-sats och HAVING-sats med samma kolumn. För att göra det måste du lägga till kolumnen två gånger i fönstret Villkor och sedan ange en instans som en del av HAVING-satsen och den andra instansen som en del av WHERE-satsen.

Ange ett WHERE-villkor i en aggregeringsfråga

  1. Ange grupperna för din fråga. För mer information, se Gruppera rader i frågeresultat (Visual Database Tools).

  2. Om den inte redan finns i fönstret Villkor lägger du till kolumnen som du vill basera WHERE villkor på.

  3. Rensa kolumnen Output såvida inte datakolumnen ingår i GROUP BY-satsen eller ingår i en mängdfunktion.

  4. I kolumnen Filter anger du villkoret WHERE. Fråge- och vydesignern lägger till villkoret i sql-instruktionens HAVING-sats.

    Anteckning

    Frågan som visas i exemplet för den här proceduren kopplar ihop två tabeller, titles och publishers.

    Vid den här tidpunkten i frågan innehåller SQL-instruktionen en HAVING-sats:

    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. I kolumnen Gruppera efter väljer du Där i listan över grupp- och sammanfattningsalternativ. Fråge- och vydesignern tar bort villkoret från HAVING-satsen i SQL-instruktionen och lägger till det i WHERE-satsen.

    SQL-instruktionen ändras så att den innehåller en WHERE-sats i stället:

    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;