How to Use FILTER to Have Multiple Counts

In PostgreSQL, the `FILTER` clause allows you to apply aggregate functions to a specific subset of data. This can be particularly useful when you want to compute multiple counts or other aggregations based on different conditions in a single query. Below, we'll explore how to perform multiple counts using the `FILTER` clause.

Understanding the FILTER Clause

The `FILTER` clause in PostgreSQL is used in conjunction with aggregate functions to filter rows before performing the aggregation. The basic syntax looks like this:


SELECT
    COUNT(*) FILTER (WHERE condition) AS condition_count,
    COUNT(*) FILTER (WHERE another_condition) AS another_condition_count
FROM your_table;
                                

In the above query, `condition` and `another_condition` are the conditions used to filter the rows before performing the count. The result will return the count for each condition in separate columns.

Example: Counting Employees Based on Status

Imagine you have an "employees" table, and you want to count how many employees are active and how many are inactive. Here's how you can achieve this using the `FILTER` clause:


SELECT
    COUNT(*) FILTER (WHERE status = 'active') AS active_count,
    COUNT(*) FILTER (WHERE status = 'inactive') AS inactive_count
FROM employees;
                                

This query will return two columns: `active_count` and `inactive_count`, each representing the count of employees with the respective status.

Advantages of Using FILTER

Using the `FILTER` clause allows you to perform multiple counts or other aggregations in a more compact and efficient manner than running multiple queries. This reduces the complexity of your queries and can improve performance, especially on larger datasets.

Conclusion

The `FILTER` clause in PostgreSQL is a powerful tool that simplifies queries when you need to perform multiple counts or aggregations based on different conditions. By filtering the data before applying aggregate functions, you can achieve cleaner, more efficient SQL queries.