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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:07:35