You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并三张表的年月列并按用户、年月汇总总价?

如何合并三张表的年月列并按用户、年月汇总总价?

嘿,我看你现在的查询思路有点走偏啦——直接把三张表做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;

代码解释

  1. UNION ALL的作用:把x、y、z三张表中结构一致的列(user_id、month、year、total_price)全部合并成一个临时数据集,这样每张表的每条记录都会单独成为一行,不会像你原来的join那样强行匹配不同表的行。
  2. 关联用户表:用LEFT JOIN可以保留所有用户(哪怕某个用户在三张表里都没有记录),如果只需要有订单记录的用户,换成INNER JOIN即可。
  3. 分组汇总:按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:39:35