显示计数数据为0的日期

vecaoik1  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(427)

我有一个这样的问题

  1. SELECT
  2. d.create_at :: DATE AS dates,
  3. count(r.id) AS usages
  4. FROM reports r LEFT JOIN dispatches d ON r.dispatch_id = d.id
  5. LEFT JOIN messages m ON d.message_id = m.id
  6. WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6
  7. GROUP BY dates
  8. ORDER BY dates;

会产生这样的结果

因为没有2020-05-03和2020-05-08的数据,所以他们不会显示在结果上
如何添加那些没有数据的日期,并将计数数据0作为值?
抱歉,我对postgres和db都是新手
我已经从各地遵循了几种解决方案似乎还没有得到我想要的结果
我试着用生成序列,但没有结果出来

  1. SELECT
  2. x.day AS dates,
  3. count(r.id) AS usages
  4. FROM (
  5. SELECT generate_series(timestamp '2020-05-01'
  6. , timestamp '2020-05-10'
  7. , interval '1 day')::date
  8. ) x(day)
  9. left join dispatches d on d.create_at = x.day
  10. LEFT JOIN reports r ON d.id = r.dispatch_id
  11. LEFT JOIN messages m ON d.message_id = m.id
  12. WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6
  13. GROUP BY dates
  14. ORDER BY dates;

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

niwlg2el

niwlg2el1#

请使用下面的查询,

  1. SELECT
  2. dt.date_seq :: DATE AS dates,
  3. count(r.id) AS usages
  4. FROM reports r LEFT JOIN dispatches d ON r.dispatch_id = d.id
  5. LEFT JOIN messages m ON d.message_id = m.id
  6. FULL OUTER JOIN (select CURRENT_DATE + i as date_seq from generate_series(date '2020-
  7. 05-01'- CURRENT_DATE, date '2020-05-10' - CURRENT_DATE ) i)
  8. dt
  9. ON d.create_at = dt.date_seq
  10. WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND
  11. '2020-05-10' AND m.client_id = 6
  12. GROUP BY dates
  13. ORDER BY dates;
wmomyfyw

wmomyfyw2#

很接近,但where子句将外部连接变回内部连接。您需要将该条件移到联接条件中。

  1. SELECT x.day AS dates,
  2. count(r.id) AS usages
  3. FROM (
  4. SELECT generate_series(timestamp '2020-05-01'
  5. , timestamp '2020-05-10'
  6. , interval '1 day')::date
  7. ) x(day)
  8. left join dispatches d on d.create_at = x.day
  9. LEFT JOIN reports r
  10. ON d.id = r.dispatch_id
  11. and r.status = 'SUCCESS'
  12. AND r.update_at::DATE BETWEEN DATE '2020-05-01' AND '2020-05-10'
  13. AND m.client_id = 6
  14. LEFT JOIN messages m ON d.message_id = m.id
  15. GROUP BY dates
  16. ORDER BY dates;
展开查看全部

相关问题