Sql 显示计数数据为0的日期

Sql 显示计数数据为0的日期,sql,postgresql,left-join,Sql,Postgresql,Left Join,我有一个这样的问题 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

我有一个这样的问题

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;
这将产生这样的结果

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_系列,但没有结果

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;

对不起,我遗漏了一些明显的东西。任何帮助都将不胜感激,谢谢

请使用下面的查询

SELECT
  dt.date_seq :: 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
FULL OUTER JOIN (select CURRENT_DATE + i as date_seq from generate_series(date '2020- 
05-01'- CURRENT_DATE, date '2020-05-10' - CURRENT_DATE ) i)
dt
ON d.create_at = dt.date_seq
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子句将外部连接变回内部连接。您需要将该条件移动到联接条件中

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;

非常感谢您的帮助,但是输出仍然不正确。非常感谢。所有显示的日期,但用法或计数数据都返回0将条件
m.client_id=6
移动到
左连接。。。m
子句…谢谢@UsagiMiyamoto我之前已经移动了,结果是所有用法或计数都被删除0@IntanKirana如果计数始终为零,则
报告
表的联接条件不会从该表中选择任何行。试着一个接一个地消除这些条件,看看是哪一个导致了这种情况。然后检查你的数据,看看为什么它丢失了Ank you@a_horse_,没有名字,已经一个接一个地删除了,直到没有条件,但仍然返回0