HAVING Clause (Microsoft Access SQL)

Specifies which grouped records are displayed in a SELECT statement with a GROUP BY clause. After GROUP BY combines records, HAVING displays any records grouped by the GROUP BY clause that satisfy the conditions of the HAVING clause.


SELECT fieldlist     FROM table     WHERE selectcriteria     GROUP BY groupfieldlist     [HAVING groupcriteria]

A SELECT statement containing a HAVING clause has these parts:

fieldlistThe name of the field or fields to be retrieved along with any field-name aliases, SQL aggregate functions, selection predicates (ALL, DISTINCT, DISTINCTROW, or TOP), or other SELECT statement options.
tableThe name of the table from which records are retrieved. For more information, see the FROM clause.
selectcriteriaSelection criteria. If the statement includes a WHERE clause, the Microsoft Access database engine groups values after applying the WHERE conditions to the records.
groupfieldlistThe names of up to 10 fields used to group records. The order of the field names in groupfieldlist determines the grouping levels from the highest to the lowest level of grouping.
groupcriteriaAn expression that determines which grouped records to display.

HAVING is optional.

HAVING is similar to WHERE, which determines which records are selected. After records are grouped with GROUP BY, HAVING determines which records are displayed:

SELECT CategoryID,


FROM Products


HAVING Sum(UnitsInStock) > 100 And Like "BOS*";

A HAVING clause can contain up to 40 expressions linked by logical operators, such as And and Or.


This example selects the job titles assigned to more than one employee in the Washington region.

This example calls the EnumFields procedure, which you can find in the SELECT statement example.

Sub HavingX()

    Dim dbs As Database, rst As Recordset

    ' Modify this line to include the path to Northwind
    ' on your computer.
    Set dbs = OpenDatabase("Northwind.mdb")

    ' Select the job titles assigned to more than one 
    ' employee in the Washington region. 
    Set rst = dbs.OpenRecordset("SELECT Title, " _
        & "Count(Title) as Total FROM Employees " _
        & "WHERE Region = 'WA' " _
        & "GROUP BY Title HAVING Count(Title) > 1;")
    ' Populate the Recordset.
    ' Call EnumFields to print recordset contents.
    EnumFields rst, 25


End Sub
See Also

ALL DISTINCT, DISTINCTROW, TOP Predicates (Microsoft Access SQL)

FROM Clause (Microsoft Access SQL)

GROUP BY Clause (Microsoft Access SQL)

ORDER BY Clause (Microsoft Access SQL)

SELECT Statement (Microsoft Access SQL)

SELECT…INTO Statement (Microsoft Access SQL)

SQL Aggregate Functions (SQL)

WHERE Clause (Microsoft Access SQL)

Community Additions