Bird
Raised Fist0
PostgreSQLquery~5 mins

FILTER clause for conditional aggregation in PostgreSQL - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the FILTER clause do in SQL aggregation?
The FILTER clause lets you apply a condition to an aggregate function, so it only counts or sums rows that meet that condition.
Click to reveal answer
beginner
Write a simple example of using FILTER with COUNT in PostgreSQL.
SELECT COUNT(*) FILTER (WHERE status = 'active') AS active_count FROM users;
Click to reveal answer
intermediate
Why use FILTER instead of CASE WHEN inside aggregate functions?
FILTER is clearer and easier to read because it separates the condition from the aggregate function, making queries simpler and more maintainable.
Click to reveal answer
intermediate
Can you use multiple FILTER clauses in one SELECT statement?
Yes, you can use multiple FILTER clauses with different conditions on different aggregate functions in the same query.
Click to reveal answer
beginner
What will this query return? SELECT SUM(amount) FILTER (WHERE type = 'sale') FROM orders;
It returns the total sum of the 'amount' column but only for rows where the 'type' is 'sale'.
Click to reveal answer
What is the purpose of the FILTER clause in SQL aggregation?
ATo apply a condition to aggregate functions
BTo filter rows before aggregation
CTo sort the results after aggregation
DTo join tables conditionally
Which of these is a valid use of FILTER in PostgreSQL?
ACOUNT(*) WHERE FILTER age > 30
BCOUNT(*) FILTER (WHERE age > 30)
CCOUNT(FILTER WHERE age > 30)
DFILTER COUNT(*) WHERE age > 30
How does FILTER improve readability compared to CASE WHEN inside aggregates?
AIt makes queries longer
BIt replaces GROUP BY
CIt requires more nested queries
DIt separates condition from aggregation clearly
Can you use FILTER with SUM and COUNT in the same query?
AYes, with different conditions
BNo, only one FILTER per query
COnly with SUM, not COUNT
DOnly with COUNT, not SUM
What does this query do? SELECT COUNT(*) FILTER (WHERE active) FROM users;
ACounts rows where active is false
BCounts all rows ignoring active
CCounts only rows where active is true
DCounts rows with NULL active
Explain how the FILTER clause works in SQL aggregation and why it is useful.
Think about how you count or sum only some rows based on a condition.
You got /4 concepts.
    Write a SQL query using FILTER to count how many orders have status 'completed' and sum amounts for 'pending' orders.
    Use FILTER clause separately for COUNT and SUM with different conditions.
    You got /3 concepts.

      Practice

      (1/5)
      1. What does the FILTER clause do in a PostgreSQL aggregate function?
      easy
      A. It filters the entire table before aggregation starts.
      B. It applies a condition to include only certain rows in the aggregation.
      C. It changes the grouping columns in the query.
      D. It sorts the results after aggregation.

      Solution

      1. Step 1: Understand the purpose of FILTER in aggregation

        The FILTER clause allows you to specify a condition inside an aggregate function to include only rows that meet that condition.
      2. Step 2: Compare with other options

        FILTER does not filter the whole table before aggregation, nor does it change grouping or sort results. It only limits rows counted or summed inside the aggregate.
      3. Final Answer:

        It applies a condition to include only certain rows in the aggregation. -> Option B
      4. Quick Check:

        FILTER = condition inside aggregate [OK]
      Hint: FILTER applies conditions inside aggregates, not on whole table [OK]
      Common Mistakes:
      • Thinking FILTER filters rows before aggregation
      • Confusing FILTER with WHERE clause
      • Assuming FILTER changes GROUP BY columns
      2. Which of the following is the correct syntax to count only rows where status = 'active' using FILTER in PostgreSQL?
      easy
      A. SELECT COUNT(*) FILTER (WHERE status = 'active') FROM users;
      B. SELECT COUNT(*) FROM users FILTER (WHERE status = 'active');
      C. SELECT COUNT(*) WHERE FILTER status = 'active' FROM users;
      D. SELECT COUNT(*) FILTER WHERE status = 'active' FROM users;

      Solution

      1. Step 1: Recall FILTER syntax in aggregate functions

        The correct syntax places FILTER with parentheses and a WHERE clause inside the aggregate function: COUNT(*) FILTER (WHERE condition).
      2. Step 2: Check each option

        SELECT COUNT(*) FILTER (WHERE status = 'active') FROM users; matches the correct syntax. The other options misuse FILTER placement or syntax.
      3. Final Answer:

        SELECT COUNT(*) FILTER (WHERE status = 'active') FROM users; -> Option A
      4. Quick Check:

        FILTER syntax = FILTER (WHERE condition) [OK]
      Hint: Use FILTER (WHERE condition) inside aggregate parentheses [OK]
      Common Mistakes:
      • Omitting parentheses after FILTER
      • Placing FILTER outside aggregate function
      • Using FILTER without WHERE keyword
      3. Given the table sales with columns region and amount, what will this query return?
      SELECT region, SUM(amount) FILTER (WHERE amount > 100) AS big_sales FROM sales GROUP BY region;
      medium
      A. Sum of all sales amounts per region.
      B. Count of sales with amount greater than 100 per region.
      C. Sum of sales amounts less than or equal to 100 per region.
      D. Sum of sales amounts greater than 100 per region.

      Solution

      1. Step 1: Understand the FILTER condition in SUM

        The FILTER clause limits the SUM to only rows where amount > 100.
      2. Step 2: Analyze the GROUP BY effect

        The query groups rows by region, then sums only amounts above 100 in each group.
      3. Final Answer:

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

        SUM with FILTER (WHERE amount > 100) = sum of big sales [OK]
      Hint: FILTER limits rows inside SUM to amount > 100 [OK]
      Common Mistakes:
      • Thinking it sums all amounts, ignoring FILTER
      • Confusing SUM with COUNT
      • Ignoring GROUP BY effect
      4. Identify the error in this query:
      SELECT department, COUNT(*) FILTER (status = 'active') FROM employees GROUP BY department;
      medium
      A. Missing WHERE keyword inside FILTER clause.
      B. GROUP BY should include status column.
      C. COUNT(*) cannot be used with FILTER.
      D. FILTER clause must be outside aggregate function.

      Solution

      1. Step 1: Check FILTER clause syntax

        FILTER requires a WHERE keyword before the condition: FILTER (WHERE condition).
      2. Step 2: Verify other parts

        GROUP BY on department is correct. COUNT(*) works with FILTER. FILTER must be inside aggregate function.
      3. Final Answer:

        Missing WHERE keyword inside FILTER clause. -> Option A
      4. Quick Check:

        FILTER syntax needs WHERE [OK]
      Hint: Always include WHERE inside FILTER parentheses [OK]
      Common Mistakes:
      • Omitting WHERE in FILTER
      • Placing FILTER outside aggregate
      • Adding unnecessary columns to GROUP BY
      5. You want to find the total sales and the total sales above 500 for each store in one query. Which query correctly uses FILTER to achieve this?
      hard
      A. SELECT store, SUM(amount) FILTER (WHERE amount > 500) AS total_sales, SUM(amount) AS big_sales FROM sales GROUP BY store;
      B. SELECT store, SUM(amount) AS total_sales, COUNT(amount) FILTER (WHERE amount > 500) AS big_sales FROM sales GROUP BY store;
      C. SELECT store, SUM(amount) AS total_sales, SUM(amount) FILTER (WHERE amount > 500) AS big_sales FROM sales GROUP BY store;
      D. SELECT store, COUNT(amount) AS total_sales, SUM(amount) FILTER (WHERE amount > 500) AS big_sales FROM sales GROUP BY store;

      Solution

      1. Step 1: Identify total sales calculation

        Total sales is the sum of all amounts per store, so SUM(amount) without filter is correct.
      2. Step 2: Identify big sales calculation

        Big sales are sums of amounts greater than 500, so SUM(amount) FILTER (WHERE amount > 500) is correct.
      3. Step 3: Check options

        SELECT store, SUM(amount) AS total_sales, SUM(amount) FILTER (WHERE amount > 500) AS big_sales FROM sales GROUP BY store; correctly assigns total_sales and big_sales. The other options mix sums and counts incorrectly or swap columns.
      4. Final Answer:

        SELECT store, SUM(amount) AS total_sales, SUM(amount) FILTER (WHERE amount > 500) AS big_sales FROM sales GROUP BY store; -> Option C
      5. Quick Check:

        SUM with and without FILTER for totals [OK]
      Hint: Use SUM(amount) and SUM(amount) FILTER (WHERE ...) together [OK]
      Common Mistakes:
      • Swapping filtered and unfiltered sums
      • Using COUNT instead of SUM for amounts
      • Misplacing FILTER clause
      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