Extending this question for a more general case:
I have a table called fruits
with a column fruit
that has three possible values: apple
, orange
, and mango
. I used the following query to get the counts of each fruit
by date
:
x
SELECT date, fruit, COUNT(id) AS count
FROM fruits
WHERE date BETWEEN '2020-10-02' AND '2020-10-05'
GROUP BY date, fruit
that gives the following results:
date fruit count
--------------------------------
2020-10-02 apple 3
2020-10-02 orange 5
2020-10-03 orange 23
2020-10-03 mango 1
2020-10-04 mango 9
2020-10-05 apple 10
2020-10-05 orange 7
2020-10-05 mango 6
As you can see, not every date
contains each type of fruit
.
Is it possible, and if so, how, to add the missing fruit by each date
to the above results with a default count=0
, as shown below?
date fruit count
--------------------------------
2020-10-02 apple 3
2020-10-02 orange 5
2020-10-02 mango 0
2020-10-03 orange 23
2020-10-03 mango 1
2020-10-03 apple 0
2020-10-04 mango 9
2020-10-04 apple 0
2020-10-04 orange 0
2020-10-05 apple 10
2020-10-05 orange 7
2020-10-05 mango 6
Advertisement
Answer
Use a cross join
ot generate the row and then a left join
to bring in the results:
select d.date, f.fruit, coalesce(ff.count, 0) as count
from (select distinct date from fruits) d cross join
(select distinct fruit from fruits) f left join
fruits ff
on ff.date = d.date and ff.fruit = f.fruit;