Bird
Raised Fist0
SQLquery~20 mins

HAVING clause for filtering groups in SQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
HAVING Clause Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
Output of HAVING with COUNT filter

Consider a table Orders with columns CustomerID and OrderID. What is the output of this query?

SELECT CustomerID, COUNT(OrderID) AS OrderCount
FROM Orders
GROUP BY CustomerID
HAVING COUNT(OrderID) > 2;

Assume the table has these rows:

CustomerID | OrderID
-----------|--------
1          | 101
1          | 102
2          | 103
2          | 104
2          | 105
3          | 106
SQL
SELECT CustomerID, COUNT(OrderID) AS OrderCount
FROM Orders
GROUP BY CustomerID
HAVING COUNT(OrderID) > 2;
A[{"CustomerID": 2, "OrderCount": 3}]
B[{"CustomerID": 3, "OrderCount": 1}]
C[{"CustomerID": 1, "OrderCount": 2}, {"CustomerID": 2, "OrderCount": 3}]
D[]
Attempts:
2 left
💡 Hint

Remember, HAVING filters groups after aggregation.

🧠 Conceptual
intermediate
1:00remaining
Purpose of HAVING clause

What is the main purpose of the HAVING clause in SQL?

ATo filter groups after aggregation
BTo filter rows before grouping
CTo sort the result set
DTo join two tables
Attempts:
2 left
💡 Hint

Think about when filtering happens in relation to grouping.

📝 Syntax
advanced
1:30remaining
Identify the syntax error in HAVING usage

Which option contains a syntax error in using the HAVING clause?

SELECT Department, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY Department
HAVING Salary > 50000;
AHAVING SUM(Salary) > 100000;
BHAVING AVG(Salary) > 50000;
CHAVING COUNT(*) > 5;
DHAVING Salary > 50000;
Attempts:
2 left
💡 Hint

Remember what HAVING can filter on after grouping.

optimization
advanced
2:00remaining
Optimizing HAVING with WHERE

Given a large Sales table with columns Region, Amount, and SaleDate, which query is more efficient to find regions with total sales over 10000 in 2023?

ASELECT Region, SUM(Amount) FROM Sales HAVING SUM(Amount) > 10000;
BSELECT Region, SUM(Amount) FROM Sales GROUP BY Region HAVING SUM(Amount) > 10000 AND YEAR(SaleDate) = 2023;
CSELECT Region, SUM(Amount) FROM Sales WHERE YEAR(SaleDate) = 2023 GROUP BY Region HAVING SUM(Amount) > 10000;
DSELECT Region, SUM(Amount) FROM Sales WHERE SUM(Amount) > 10000 GROUP BY Region;
Attempts:
2 left
💡 Hint

Filter rows before grouping when possible.

🔧 Debug
expert
2:30remaining
Why does this HAVING query return no rows?

Given the table Products with columns Category and Price, why does this query return no rows?

SELECT Category, AVG(Price) AS AvgPrice
FROM Products
GROUP BY Category
HAVING AVG(Price) < 0;
ABecause AVG(Price) returns NULL for all groups.
BBecause average price cannot be less than zero, so no groups match the condition.
CBecause the HAVING clause syntax is incorrect.
DBecause the GROUP BY clause is missing a column.
Attempts:
2 left
💡 Hint

Think about the possible values of average price.

Practice

(1/5)
1.

What is the main purpose of the HAVING clause in SQL?

easy
A. To filter individual rows before grouping
B. To sort the results of a query
C. To filter groups created by GROUP BY based on aggregate conditions
D. To join two tables together

Solution

  1. Step 1: Understand the role of GROUP BY

    The GROUP BY clause groups rows based on column values.
  2. Step 2: Identify the purpose of HAVING

    HAVING filters these groups using aggregate functions like SUM or COUNT.
  3. Final Answer:

    To filter groups created by GROUP BY based on aggregate conditions -> Option C
  4. Quick Check:

    HAVING filters groups, not rows [OK]
Hint: Remember: WHERE filters rows, HAVING filters groups [OK]
Common Mistakes:
  • Confusing HAVING with WHERE clause
  • Using HAVING without GROUP BY
  • Thinking HAVING sorts data
2.

Which of the following is the correct syntax to filter groups with HAVING?

SELECT department, COUNT(*) FROM employees GROUP BY department _______ COUNT(*) > 5;
easy
A. GROUP BY
B. WHERE
C. FILTER
D. HAVING

Solution

  1. Step 1: Identify filtering clause after grouping

    After GROUP BY, filtering groups requires HAVING, not WHERE.
  2. Step 2: Confirm correct clause usage

    HAVING COUNT(*) > 5 filters groups with more than 5 employees.
  3. Final Answer:

    HAVING -> Option D
  4. Quick Check:

    Use HAVING after GROUP BY [OK]
Hint: Use HAVING to filter groups, not WHERE [OK]
Common Mistakes:
  • Using WHERE instead of HAVING after GROUP BY
  • Placing HAVING before GROUP BY
  • Using FILTER keyword which is invalid here
3.

Given the table sales with columns region and amount, what will this query return?

SELECT region, SUM(amount) FROM sales GROUP BY region HAVING SUM(amount) > 1000;
medium
A. All regions with total sales greater than 1000
B. All regions with total sales less than or equal to 1000
C. All sales records with amount greater than 1000
D. Syntax error due to HAVING clause

Solution

  1. Step 1: Group sales by region and sum amounts

    The query groups rows by region and calculates total amount per region.
  2. Step 2: Filter groups with total sales > 1000

    The HAVING clause keeps only regions where the sum is greater than 1000.
  3. Final Answer:

    All regions with total sales greater than 1000 -> Option A
  4. Quick Check:

    HAVING filters groups by aggregate sum [OK]
Hint: HAVING filters groups by aggregate results [OK]
Common Mistakes:
  • Thinking HAVING filters individual rows
  • Confusing SUM(amount) with amount column
  • Assuming syntax error with HAVING
4.

Identify the error in this query:

SELECT category, COUNT(*) FROM products HAVING COUNT(*) > 10 GROUP BY category;
medium
A. Missing WHERE clause before HAVING
B. HAVING clause used before GROUP BY
C. COUNT(*) cannot be used in HAVING
D. GROUP BY should be replaced with ORDER BY

Solution

  1. Step 1: Check order of clauses in SQL

    The correct order is GROUP BY first, then HAVING.
  2. Step 2: Identify incorrect clause order

    The query places HAVING before GROUP BY, causing syntax error.
  3. Final Answer:

    HAVING clause used before GROUP BY -> Option B
  4. Quick Check:

    GROUP BY before HAVING [OK]
Hint: GROUP BY must come before HAVING [OK]
Common Mistakes:
  • Placing HAVING before GROUP BY
  • Thinking HAVING needs WHERE before it
  • Replacing GROUP BY with ORDER BY incorrectly
5.

You have a students table with columns class and score. You want to find classes where the average score is at least 75 and the number of students is more than 10. Which query achieves this?

hard
A. SELECT class, AVG(score), COUNT(*) FROM students GROUP BY class HAVING AVG(score) >= 75 AND COUNT(*) > 10;
B. SELECT class, AVG(score), COUNT(*) FROM students HAVING AVG(score) >= 75 AND COUNT(*) > 10 GROUP BY class;
C. SELECT class, AVG(score), COUNT(*) FROM students WHERE AVG(score) >= 75 AND COUNT(*) > 10 GROUP BY class;
D. SELECT class, AVG(score), COUNT(*) FROM students GROUP BY class WHERE AVG(score) >= 75 AND COUNT(*) > 10;

Solution

  1. Step 1: Group students by class

    Use GROUP BY class to group rows by class.
  2. Step 2: Filter groups with HAVING using aggregate conditions

    Use HAVING AVG(score) >= 75 AND COUNT(*) > 10 to keep classes meeting both conditions.
  3. Final Answer:

    SELECT class, AVG(score), COUNT(*) FROM students GROUP BY class HAVING AVG(score) >= 75 AND COUNT(*) > 10; -> Option A
  4. Quick Check:

    HAVING filters groups by multiple aggregates [OK]
Hint: Use HAVING for multiple aggregate filters after GROUP BY [OK]
Common Mistakes:
  • Placing HAVING before GROUP BY
  • Using WHERE with aggregate functions
  • Putting WHERE after GROUP BY