0

I have the following table

name type created_at
John student 2022-10-01
Tom student 2022-10-02
Susan teacher 2022-10-10

I need a query to get the count for each distinct value in type column in filtered result and display zero's if no instances of this type exist in result.

I tried the following

SELECT type, COUNT(*)
    FROM tablename
    where created_at between '2022-10-01' and '2022-10-02'
    group by type;

which will give

type count
student 2

I need:

type count
student 2
teacher 0
Archie
  • 115
  • 1
  • 3
  • 10

1 Answers1

0

Use conditional aggregation with a calendar table approach:

SELECT t1.type, COUNT(t2.type) AS count
FROM (SELECT DISTINCT type FROM tablename) t1
LEFT JOIN tablename t2
    ON t2.type = t1.type AND
       t2.created_at BETWEEN '2022-10-01' AND '2022-10-02'
GROUP BY t1.type;

Note that ideally you should have some other table which stores all types. Then, you could use that in place of the inline distinct query I have above.

Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360