【问题标题】:Fill in missing dates for multiple values with a GROUP BY使用 GROUP BY 填充多个值的缺失日期
【发布时间】:2013-11-26 19:47:34
【问题描述】:

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

我的表设置如下:

条目:

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。假设我在那里包含WHERE 子句AND 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

日历表背后的想法是能够提取一个范围内的所有日期并将它们与条目表连接以填充那些缺失的日期,但我一直无法弄清楚如何做到这一点。

谁能指出我正确的方向?

【问题讨论】:

    标签: mysql sql gaps-and-islands


    【解决方案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
    

    【讨论】:

    • 我知道我忘记了原始帖子中的某些内容——请参阅我的编辑。我还需要它在 where 子句中提供 user_id 的地方填写 0,但表中没有该用户的条目。
    • 您需要一个单独的表格来列出您的用户,就像日历一样
    • 我确实有一个包含 user_id 的用户表——我也需要加入吗?
    • 是的。结果中的所有内容都必须来自某个地方。如果您想要条目表中缺少的 user_id,则需要引入一个包含它们的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多