SQL: Counting with Conditions
Three different ways in SQL for counting rows that satisfy certain conditions.

Given the following sample table
| Name | Height (cm) | Weight (kg) |
|---|---|---|
| Alice | 150 | 50 |
| Bob | 160 | 60 |
| Charlie | 170 | 70 |
we want to write an SQL query that asks the following questions:
- How many persons have a height >= 160?
- How many persons have a weight >= 70?
The answers shall be given in a single table like this:
| # with Height >= 160 | # with Weight >= 70 |
|---|---|
| 2 | 1 |
Here are three different solutions, ordered by descending length:
-- Count with subselect:
SELECT
(SELECT COUNT(*) FROM persons WHERE height >= 160) AS height_count,
(SELECT COUNT(*) FROM persons WHERE weight >= 70) AS weight_count;
-- Count with case:
SELECT
COUNT(CASE WHEN height >= 160 THEN 1 END) AS height_count,
COUNT(CASE WHEN weight >= 70 THEN 1 END) AS weight_count
FROM persons;
-- Sum with cast from bool to int:
SELECT
SUM((height >= 160)::int) AS height_count,
SUM((weight >= 70)::int) AS weight_count
FROM persons;
Tested with PostgreSQL 12.
Enji's Blog