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
相关产品推荐
相关产品推荐

