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

MySQL如何按book_id分组,对不同order_id的amount去重求和

你目前的写法是直接对所有匹配book_id = 'a'的行的amount字段求和,而同一个order_id下有多条重复的amount记录,这些重复值都会被计入总和,所以得到的是103 + 202 + 30 = 100,和预期不符。

要实现每个order_id仅统计一次amount的需求,可以通过子查询先对order_id维度去重后再求和,以下是可直接运行的MySQL语句:

写法1:用DISTINCT去重(适合同一个order_id对应的amount固定的场景)

SELECT book_id, SUM(amount) AS `sum`
FROM (
    SELECT DISTINCT book_id, order_id, amount
    FROM `table`
    WHERE book_id = 'a'
) AS t
GROUP BY book_id;

写法2:两层分组实现(兼容性更强,即使同个order_id出现不同amount也可按规则取值)

这里内层分组用MAX(amount)取每个order_id对应的金额,也可根据业务需求替换为MIN(amount)等聚合函数:

SELECT book_id, SUM(amount) AS `sum`
FROM (
    SELECT book_id, order_id, MAX(amount) AS amount
    FROM `table`
    WHERE book_id = 'a'
    GROUP BY book_id, order_id
) AS temp
GROUP BY book_id;

以上两种写法最终输出的sum结果都是60,符合预期。如果需要统计所有book_id的对应结果,删掉WHERE条件即可。注意table是MySQL保留字,作为表名使用时需要用反引号包裹避免语法错误。

内容的提问来源于stack exchange,提问作者iFrong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:21:02