sql - 显示计数数据为 0 的日期
问题描述
我有这样的查询
SELECT
d.create_at :: DATE AS dates,
count(r.id) AS usages
FROM reports r LEFT JOIN dispatches d ON r.dispatch_id = d.id
LEFT JOIN messages m ON d.message_id = m.id
WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6
GROUP BY dates
ORDER BY dates;
这将产生这样的结果
没有日期 2020-05-03 和 2020-05-08 的数据,因此它们不会显示在结果中
如何添加那些没有数据的日期并将计数数据 0 作为值?
抱歉,我是 Postgres 和 DB 的新手
我已经从各地遵循了几个解决方案似乎还没有得到我想要的结果
我尝试使用 generate_series 但没有结果出来
SELECT
x.day AS dates,
count(r.id) AS usages
FROM (
SELECT generate_series(timestamp '2020-05-01'
, timestamp '2020-05-10'
, interval '1 day')::date
) x(day)
left join dispatches d on d.create_at = x.day
LEFT JOIN reports r ON d.id = r.dispatch_id
LEFT JOIN messages m ON d.message_id = m.id
WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6
GROUP BY dates
ORDER BY dates;
抱歉,如果我遗漏了一些明显的东西。任何帮助将不胜感激,谢谢!
解决方案
您很接近,但是您的 WHERE 子句将外部联接重新转换为内部联接。您需要将该条件移动到 JOIN 条件中。
SELECT x.day AS dates,
count(r.id) AS usages
FROM (
SELECT generate_series(timestamp '2020-05-01'
, timestamp '2020-05-10'
, interval '1 day')::date
) x(day)
left join dispatches d on d.create_at = x.day
LEFT JOIN reports r
ON d.id = r.dispatch_id
and r.status = 'SUCCESS'
AND r.update_at::DATE BETWEEN DATE '2020-05-01' AND '2020-05-10'
AND m.client_id = 6
LEFT JOIN messages m ON d.message_id = m.id
GROUP BY dates
ORDER BY dates;
推荐阅读
- excel - 如何将 COUNTIFS 与 INDIRECT 结合使用?
- lldb - 如何分页 lldb 调试器帮助文本?
- scala - Spark:数据帧检查点与显式写入磁盘的效率
- shell - 在 shell 脚本中杀死并重新启动 ngrok
- html - 如何根据屏幕尺寸在 Bootstrap 中制作不同高度的部分
- python - 如何在python函数中添加自定义参数参数?
- ios - 除非我先选择不同的行,否则 UIPickerView 不会选择第一行?
- java - 检查用户是否已存在于 firebase 实时数据库中
- javascript - 在 React Native 中全局存储用户定义的数据,以便在任何文件中使用
- java - Gradle:将依赖项从 Java 添加到本机编译