MySQL 5.7中如何按日期与商家分组计算制造商所有产品的平均折扣
解决MySQL 5.7中按商家和日期计算平均折扣的问题
首先得指出你当前SQL的两个核心问题:
- 分组后直接引用
t.PRICE_ACTUAL和p.PRICE_RECOM,在MySQL 5.7的严格模式(默认开启ONLY_FULL_GROUP_BY)下会报错,因为非聚合字段必须出现在GROUP BY里; - 逻辑上没有正确实现“按商家和日期计算制造商所有产品的平均折扣”——你需要先计算每个产品的折扣,再按分组维度聚合,或者计算整体的折扣幅度。
下面分两种常见的折扣计算场景,给出正确的SQL:
场景1:计算每个产品的平均折扣率
这种方式是先算出单个产品的折扣比例(1 - 实际价/推荐价),再对所有产品的折扣率取平均值,得到该商家当日所有指定制造商产品的平均折扣百分比。
SELECT date, merchant_id, -- 先算单条记录的折扣率,再取平均后转成百分比 AVG(1 - (t.PRICE_ACTUAL / p.PRICE_RECOM)) * 100 AS avg_discount_percent FROM merchants_prices t INNER JOIN produts_manufacturers p ON t.PROD_ID = p.PROD_ID WHERE p.MANUFACTURER_ID = 1 AND t.PRICE_ACTUAL IS NOT NULL GROUP BY date, merchant_id ORDER BY date DESC, merchant_id;
比如用你给的示例数据计算:
- 商家10在21-01-20只有产品1,折扣率是
1-9/10=0.1,平均折扣就是10%; - 商家11在21-01-20的产品1折扣率是
1-8.8/10=0.12,平均折扣就是12%; - 商家11在22-01-19的产品1折扣率是
1-9/10=0.1,平均折扣就是10%。
场景2:计算整体折扣幅度
如果你的需求是看商家当日销售该制造商所有产品的整体优惠力度(总实际销售额/总推荐销售额的比例,再反推折扣),可以用下面的SQL:
SELECT date, merchant_id, -- 用总实际价除以总推荐价,再计算整体折扣百分比 (1 - (SUM(t.PRICE_ACTUAL) / SUM(p.PRICE_RECOM))) * 100 AS overall_discount_percent FROM merchants_prices t INNER JOIN produts_manufacturers p ON t.PROD_ID = p.PROD_ID WHERE p.MANUFACTURER_ID = 1 AND t.PRICE_ACTUAL IS NOT NULL GROUP BY date, merchant_id ORDER BY date DESC, merchant_id;
这种方式适合看整体的优惠幅度,比如如果商家同一天卖了多个产品,总实际价之和除以总推荐价之和,得到的是整体售价占原价的比例,1减去这个比例就是整体的折扣百分比。
你可以根据自己的业务需求选择对应的计算方式。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

