【发布时间】:2013-11-09 14:29:10
【问题描述】:
猜想这个问题有很多变体,但是这有一个转折。
我的主表包含某些用户在某些日期记录的公里数:
表km_run:
|entry|mnumber|dato |km | 其中“dato”是具体日期。格式如下:
|1 |3 |2013-01-01|5.7|
对于特定用户('mnumber'),我想计算一年中每周的总和。为此,我制作了一个“虚拟表”,其中仅包含从 1 到 53 的周数:
Table `week_list`:
|week|
|1 |
|2 |
等等。
这个查询给出了总和,但是如果特定周的“km_run”中没有条目,我找不到返回零的方法。
SELECT `week_list`.`week`, WEEKOFYEAR(`km_run`.`dato`), SUM(`km_run`.`km`)
FROM `week_list` LEFT JOIN `km_run` ON WEEKOFYEAR(`dato`) = `week_list`.`week`
WHERE `km_run`.`mnumber` = 3 AND `km_run`.`dato` >= '2013-01-01'
AND `km_run`.`dato` < '2014-01-01'
GROUP BY WEEKOFYEAR(`dato`)
我尝试过 COALESCE( SUM(km),0) 并且我还尝试过使用 IFNULL 函数围绕总和。尽管有左连接,但并非 week_list 中的所有记录都在 sql 语句中返回。
结果如下:
week | WEEKOFYEAR(`km_run`.`dato`) | SUM(`km_run`.`km`)
1 | 1 | 58.4
3 | 3 | 50.7
4 | 4 | 39.2
如您所见,第二周被跳过而不是返回 0
【问题讨论】:
-
请添加您的示例数据集,这将很有帮助
标签: mysql sum left-join week-number