Använda HAVING- och WHERE-satser i samma fråga (Visual Database Tools)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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 iWHERE
-satsen grupperas.Satsen
HAVING
tillämpas sedan på raderna i resultatuppsättningen. Endast de grupper som uppfyllerHAVING
villkor visas i frågeutdata. Du kan endast använda enHAVING
-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
Ange grupperna för din fråga. För mer information, se Gruppera rader i frågeresultat (Visual Database Tools).
Om den inte redan finns i fönstret Villkor lägger du till kolumnen som du vill basera
WHERE
villkor på.Rensa kolumnen Output såvida inte datakolumnen ingår i GROUP BY-satsen eller ingår i en mängdfunktion.
I kolumnen Filter anger du villkoret
WHERE
. Fråge- och vydesignern lägger till villkoret i sql-instruktionensHAVING
-sats.Anteckning
Frågan som visas i exemplet för den här proceduren kopplar ihop två tabeller,
titles
ochpublishers
.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'
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 iWHERE
-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;