mysql - GROUP BY 和 SUM 但拆分 GROUP BY 结果
问题描述
数据集:
User Internal Hours External Hours Date
Dave 9 0 2020-11-01
Joe 1 0 2020-11-01
Joe 1 0 2020-11-02
Chris 2 0 2020-11-01
Joe 3 0 2020-11-03
Chris 2 0 2020-11-02
Chris 0 0 2020-11-03
Dave 3 0 2020-11-02
Joe 5 0 2020-11-03
Chris 0 3 2020-11-03
Chris 0 1 2020-11-01
Dave 0 1 2020-11-01
Joe 0 2 2020-11-01
Joe 0 4 2020-11-02
Joe 0 2 2020-11-03
Chris 0 3 2020-11-02
Chris 0 3 2020-11-03
Dave 0 1 2020-11-03
一个简单的:
SELECT
User,
Date
SUM(External)
SUMInternal)
FROM table
GROUP BY User,Date
返回:
User Date Internal Hours External Hours
Dave 2020-11-01 12 1
Dave 2020-11-01 0 1
Joe 2020-11-01 1 4
Joe 2020-11-02 1 5
Chris 2020-11-02 2 6
Chris 2020-11-03 2 6
或somethgin equivilent(真的很难从我的数据中弄清楚实际总结了什么,但每个用户总是有2个实例,而且所有事情似乎都在2个日期下总结出来)
然而,我所追求的是:
User Date Internal Hours External Hours
Dave 2020-11-01 9 1
Dave 2020-11-02 3 0
Dave 2020-11-03 0 1
Joe 2020-11-01 1 2
Joe 2020-11-02 1 4
Joe 2020-11-03 3 2
Chris 2020-11-01 2 1
Chris 2020-11-02 2 3
Chris 2020-11-03 0 3
使用一个结果表,每个日期、每个用户和所有内容都正确总结
我尝试过内部连接、左连接、交叉连接、内部选择,但没有一个工作正常或处理时间超过 5 分钟(超过 135,000 条记录)。
我知道有一个明显的方法我错过了,我不想用子选择强行使用它,并且让这份每日报告需要几个小时。
有什么想法吗?
解决方案
SELECT
User,
`Date`,
COALESCE(SUM(External), 0),
COALESCE(SUM(Internal), 0)
FROM (SELECT DISTINCT User FROM test) t1
CROSS JOIN (SELECT DISTINCT `Date` FROM test) t2
LEFT JOIN test USING (User, `Date`)
GROUP BY User, `Date`
ORDER BY 1,2;
交叉连接的子查询生成所有可能的用户数据对。即使这对在数据中也不存在,它将出现在输出中。