使用GROUP BY填写多个值的缺失日期

时间:2013-11-26 19:47:34

标签: mysql sql gaps-and-islands

我正在尝试编写单个查询,以便在一个日期范围内检索多个用户的时间信息。

我的表格设置如下:

项:

user_id  | entry_date  | entry_hours
1        | 2013-11-12  | 4
1        | 2013-11-12  | 5
1        | 2013-11-13  | 3
2        | 2013-11-13  | 7
....

日历:

calendar_date
.....
2013-11-10
2013-11-11
2013-11-12
2013-11-13
2013-11-14
.....

如果我运行此查询:

SELECT *, e.user_id, e.entry_date, COALESCE(SUM(e.entry_hours), 0) as total
            FROM `entry` e
            WHERE entry_date BETWEEN '2013-11-12' and '2013-11-13'
            GROUP BY e.user_id, e.entry_date

我得到的是

的效果
user_id  |  entry_date  |  total
  1      |  2013-11-12  |  9
  1      |  2013-11-13  |  3
  2      |  2013-11-13  |  7

当我想要这样的时候:

user_id  |  entry_date  |  total
  1      |  2013-11-12  |  9
  1      |  2013-11-13  |  3
  2      |  2013-11-12  |  0
  2      |  2013-11-13  |  7

使用0填写缺失日期。

编辑:当他们没有列出的条目时,我还需要用0来引入user_id。假设我包含在WHEREAND user_id IN (1,2,3)中,我会得到类似的结果:

user_id  |  entry_date  |  total
  1      |  2013-11-12  |  9
  1      |  2013-11-13  |  3
  2      |  2013-11-12  |  0
  2      |  2013-11-13  |  7
  3      |  2013-11-12  |  0
  3      |  2013-11-13  |  0

日历表背后的想法是能够拉出范围内的所有日期并将它们与条目表连接以填写缺少的日期,但我一直无法弄清楚如何执行此操作。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

SELECT
  u.user_id,
  c.calendar_date,
  COALESCE(SUM(e.entry_hours), 0)
FROM calendar c
CROSS JOIN users u
LEFT JOIN entry e
   ON (c.calendar_date = e.entry_date AND u.user_id = e.user_id)
GROUP BY u.user_id,c.calendar_date

答案 1 :(得分:0)

这是你在找什么? Mysql show everyday between even if there are no results

我这样做的方法是拥有一张日历表。