I want to count the number of item by date, but sometimes the table doesn't contains rows with some dates, and I have a hole in the result, like :
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 1 |
| 2021-03-15 | 1 |
| 2021-03-17 | 1 |
| 2021-03-18 | 1 |
+------------+--------+
I would like this result:
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 1 |
| 2021-03-13 | 0 |
| 2021-03-14 | 0 |
| 2021-03-15 | 1 |
| 2021-03-16 | 0 |
| 2021-03-17 | 1 |
| 2021-03-18 | 1 |
+------------+--------+
So, I created a temporary table with WITH
, it works:
WITH recursive Date_Ranges AS (
select DATE(NOW() - INTERVAL 3 MONTH) AS Date
union
select Date + interval 1 day
from Date_Ranges
where Date < DATE(NOW())
)
SELECT *, 0 AS number FROM Date_Ranges
Next, I want to retrieve the statistics, I tried with this query:
WITH recursive Date_Ranges AS (
select DATE(NOW()- INTERVAL 3 MONTH) AS Date
union
select Date + interval 1 day
from Date_Ranges
where Date < DATE(NOW())
)
select *, '0' AS value from Date_Ranges
UNION DISTINCT
SELECT DATE(time) AS date, count(*) AS number
FROM my_table
WHERE time >= NOW()- INTERVAL 3 MONTH
AND time <= DATE(NOW())
GROUP BY DATE(ca_time)
But the UNION
doesn't work because the value is different so mysql keep the 2 lines:
example:
+------------+--------+
| date | number |
+------------+--------+
| 2021-03-12 | 0 |
| 2021-03-13 | 0 |
| 2021-03-14 | 0 |
| 2021-03-15 | 0 |
| 2021-03-16 | 0 |
| 2021-03-17 | 0 |
| 2021-03-18 | 0 |
| 2021-03-12 | 2 |
| 2021-03-13 | 6 |
| 2021-03-14 | 7 |
| 2021-03-15 | 8 |
| 2021-03-16 | 9 |
| 2021-03-17 | 5 |
| 2021-03-18 | 0 |
+------------+--------+
How the lines with 0 can be merge with the second union ?
Thanks.
Edit:
I tried with this query, but dates without result are not here:
WITH recursive dates AS (
SELECT DATE(NOW() - INTERVAL 3 MONTH) AS Date
UNION ALL
SELECT Date + interval 1 day
FROM dates
WHERE Date < DATE(NOW())
)
SELECT date, COALESCE(COUNT(1), 0) AS number
FROM dates
LEFT JOIN geo
ON dates.date = DATE(geo.ca_time)
WHERE departmentCode = '89'
GROUP BY geo.ca_time
ORDER BY geo.ca_time
result:
+------------+--------+
| date | number |
+------------+--------+
| 2021-02-21 | 1 |
| 2021-02-22 | 11 |
| 2021-02-27 | 8 |
...