Bird
Raised Fist0
SQLquery~10 mins

CASE with aggregate functions in SQL - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to count how many orders have a total price greater than 100.

SQL
SELECT COUNT(CASE WHEN total_price [1] 100 THEN 1 END) AS high_value_orders FROM orders;
Drag options to blanks, or click blank then click option'
A>
B<=
C=
D<
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<' instead of '>' will count orders less than 100.
Using '=' will only count orders exactly 100.
2fill in blank
medium

Complete the code to sum the total_price only for orders where status is 'completed'.

SQL
SELECT SUM(CASE WHEN status = 'completed' THEN [1] ELSE 0 END) AS completed_total FROM orders;
Drag options to blanks, or click blank then click option'
A0
B1
Cstatus
Dtotal_price
Attempts:
3 left
💡 Hint
Common Mistakes
Returning 1 counts orders but does not sum prices.
Returning status is incorrect because it's a string, not a number.
3fill in blank
hard

Fix the error in the query to count orders with discount applied (discount > 0).

SQL
SELECT COUNT(CASE WHEN discount [1] 0 THEN 1 END) AS discounted_orders FROM orders;
Drag options to blanks, or click blank then click option'
A<=
B>
C==
D!=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '==' causes syntax error in SQL.
Using '<=' counts orders with no discount or zero discount.
4fill in blank
hard

Fill both blanks to calculate average price for 'shipped' orders only.

SQL
SELECT AVG(CASE WHEN status [1] 'shipped' THEN [2] ELSE NULL END) AS avg_shipped_price FROM orders;
Drag options to blanks, or click blank then click option'
A=
Btotal_price
Cstatus
D!=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '!=' will average orders not shipped.
Returning status instead of total_price gives wrong data type.
5fill in blank
hard

Fill all three blanks to count orders with priority 'high' and total_price over 200.

SQL
SELECT COUNT(CASE WHEN priority [1] 'high' AND total_price [2] [3] THEN 1 END) AS high_value_high_priority FROM orders;
Drag options to blanks, or click blank then click option'
A=
B>
C200
D<
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<' instead of '>' reverses the condition.
Using wrong value for price threshold causes wrong count.

Practice

(1/5)
1. What does the following SQL snippet do?
SELECT SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) FROM users;
easy
A. Counts how many users have status other than 'active'.
B. Calculates the total number of users regardless of status.
C. Returns the sum of all status values.
D. Counts how many users have status 'active'.

Solution

  1. Step 1: Understand the CASE inside SUM

    The CASE returns 1 for each row where status is 'active', else 0.
  2. Step 2: SUM adds all 1s and 0s

    SUM counts how many rows have status 'active' by adding 1s.
  3. Final Answer:

    Counts how many users have status 'active'. -> Option D
  4. Quick Check:

    SUM(CASE WHEN condition THEN 1 ELSE 0 END) counts matches [OK]
Hint: SUM with CASE counting 1s counts matching rows [OK]
Common Mistakes:
  • Thinking SUM adds status values instead of counting
  • Confusing ELSE 0 with ELSE NULL
  • Assuming it counts non-active users
2. Which of the following is the correct syntax to count rows where score is greater than 50 using CASE inside COUNT?
easy
A. SELECT COUNT(CASE WHEN score > 50 THEN 1 END) FROM results;
B. SELECT COUNT(CASE score > 50 THEN 1 ELSE 0 END) FROM results;
C. SELECT COUNT(CASE WHEN score > 50 THEN 1 ELSE 0 END) FROM results;
D. SELECT COUNT(CASE score > 50 THEN 1 END) FROM results;

Solution

  1. Step 1: Recall COUNT counts non-null values

    COUNT counts rows where expression is NOT NULL.
  2. Step 2: Use CASE to return 1 for matches, NULL otherwise

    CASE WHEN condition THEN 1 END returns 1 or NULL (default ELSE NULL).
  3. Final Answer:

    SELECT COUNT(CASE WHEN score > 50 THEN 1 END) FROM results; -> Option A
  4. Quick Check:

    COUNT with CASE returning NULL for no match counts only matches [OK]
Hint: COUNT counts non-null, so ELSE NULL is default [OK]
Common Mistakes:
  • Using ELSE 0 causes COUNT to count all rows
  • Omitting WHEN keyword
  • Using invalid CASE syntax
3. Given the table sales with columns region and amount, what is the output of this query?
SELECT region, SUM(CASE WHEN amount > 100 THEN amount ELSE 0 END) AS big_sales FROM sales GROUP BY region;
medium
A. Sum of all sales amounts per region.
B. Sum of sales amounts greater than 100 per region.
C. Count of sales greater than 100 per region.
D. Sum of sales amounts less than or equal to 100 per region.

Solution

  1. Step 1: Analyze CASE inside SUM

    CASE returns amount if > 100, else 0, so only big sales count fully.
  2. Step 2: SUM adds these amounts per region

    SUM totals amounts > 100 per region, ignoring smaller sales by adding 0.
  3. Final Answer:

    Sum of sales amounts greater than 100 per region. -> Option B
  4. Quick Check:

    SUM with CASE filters values conditionally [OK]
Hint: SUM with CASE ELSE 0 sums only matching values [OK]
Common Mistakes:
  • Thinking it counts rows instead of sums amounts
  • Ignoring ELSE 0 and expecting NULL filtering
  • Confusing greater than with less than
4. Identify the error in this query:
SELECT department, COUNT(CASE department = 'HR' THEN 1 ELSE NULL END) FROM employees GROUP BY department;
medium
A. Missing WHEN keyword in CASE statement.
B. COUNT cannot be used with CASE.
C. GROUP BY should include COUNT column.
D. ELSE NULL is invalid in CASE.

Solution

  1. Step 1: Check CASE syntax

    CASE requires WHEN before condition; here it's missing.
  2. Step 2: Confirm correct syntax

    Correct form: CASE WHEN department = 'HR' THEN 1 ELSE NULL END.
  3. Final Answer:

    Missing WHEN keyword in CASE statement. -> Option A
  4. Quick Check:

    CASE syntax needs WHEN before condition [OK]
Hint: CASE must have WHEN before condition [OK]
Common Mistakes:
  • Omitting WHEN keyword
  • Misusing COUNT with CASE
  • Incorrect GROUP BY usage
5. You want to find the average salary of employees, but only include salaries above 50000. Which query correctly uses CASE with AVG to achieve this?
hard
A. SELECT AVG(CASE WHEN salary > 50000 THEN salary ELSE 0 END) FROM employees;
B. SELECT AVG(CASE salary > 50000 THEN salary END) FROM employees;
C. SELECT AVG(CASE WHEN salary > 50000 THEN salary ELSE NULL END) FROM employees;
D. SELECT AVG(CASE salary > 50000 THEN salary ELSE NULL END) FROM employees;

Solution

  1. Step 1: Understand AVG ignores NULLs

    AVG calculates average of non-null values only.
  2. Step 2: Use CASE to return salary if > 50000, else NULL

    This excludes salaries ≤ 50000 from average calculation.
  3. Final Answer:

    SELECT AVG(CASE WHEN salary > 50000 THEN salary ELSE NULL END) FROM employees; -> Option C
  4. Quick Check:

    AVG with CASE ELSE NULL excludes unwanted rows [OK]
Hint: Use ELSE NULL to exclude rows from AVG calculation [OK]
Common Mistakes:
  • Using ELSE 0 includes zeros in average, skewing result
  • Omitting WHEN keyword
  • Using invalid CASE syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard