如何合并三张表的年月列并按用户、年月汇总总价?
如何合并三张表的年月列并按用户、年月汇总总价?
嘿,我看你现在的查询思路有点走偏啦——直接把三张表做inner join会导致只有在三张表同时存在相同user_id、年月的记录才会被保留,而且计算总价的时候还会把不对应年月的价格错误叠加,完全达不到你想要的效果。
其实正确的思路应该是先把三张表的相似记录「平铺合并」,再分组汇总,具体步骤如下:
正确的SQL写法
-- 先把三张表的核心数据合并,再关联用户表并汇总 SELECT u.user_id, combined.month, combined.year, SUM(combined.total_price) AS total_price FROM `user` u LEFT JOIN ( -- 用UNION ALL把三张表的相同结构列合并 SELECT user_id, month, year, total_price FROM x UNION ALL SELECT user_id, month, year, total_price FROM y UNION ALL SELECT user_id, month, year, total_price FROM z ) AS combined ON u.user_id = combined.user_id WHERE combined.user_id IS NOT NULL -- 过滤掉没有任何订单记录的用户(可选) GROUP BY u.user_id, combined.month, combined.year ORDER BY u.user_id, combined.year, combined.month;
代码解释
- UNION ALL的作用:把x、y、z三张表中结构一致的列(user_id、month、year、total_price)全部合并成一个临时数据集,这样每张表的每条记录都会单独成为一行,不会像你原来的join那样强行匹配不同表的行。
- 关联用户表:用LEFT JOIN可以保留所有用户(哪怕某个用户在三张表里都没有记录),如果只需要有订单记录的用户,换成INNER JOIN即可。
- 分组汇总:按
user_id、month、year分组,对total_price求和,就能得到每个用户每个年月的总消费金额,完全符合你想要的结果格式。
为什么你的原查询不对?
你原来的JOIN x JOIN y JOIN z会把三张表的行强行关联,比如用户1在x有1月、2月的记录,在y、z有3月的记录,这样关联后会生成1月-3月-3月、2月-3月-3月这样的无效组合,sum出来的价格也是错误的(比如1月的总价会加上y和z的3月价格),完全不是按年月单独汇总的逻辑。
备注:内容来源于stack exchange,提问作者Pioter
相关产品推荐
相关产品推荐

