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

如何在MySQL中以1月为基准计算各产品销售额占比?

MySQL实现产品各月销售额相对1月基准的占比计算

针对你需要以每个产品1月销售额为基准计算各月占比的需求,这里提供两种MySQL实现方案,适配不同版本的数据库:

方案一:MySQL 8.0+ 版本(推荐使用窗口函数)

窗口函数可以更简洁地获取每个产品的1月基准销售额,无需额外关联子查询:

SELECT
    Prod_id,
    Mon,
    Sale,
    -- 计算占比并取整
    ROUND((Sale / MAX(CASE WHEN Mon = 1 THEN Sale END) OVER (PARTITION BY Prod_id)) * 100) AS Perc,
    -- 可选:添加基准行的注释(和预期结果格式一致)
    CASE 
        WHEN Mon = 1 THEN CONCAT('100 - pivot for product ', Prod_id) 
        ELSE CAST(ROUND((Sale / MAX(CASE WHEN Mon = 1 THEN Sale END) OVER (PARTITION BY Prod_id)) * 100) AS CHAR) 
    END AS Perc_with_note
FROM
    sales_table
ORDER BY
    Prod_id, Mon;

代码说明:

  • MAX(CASE WHEN Mon = 1 THEN Sale END) OVER (PARTITION BY Prod_id):通过窗口函数按产品分组,提取每个组内1月的销售额作为基准值
  • ROUND(...) * 100:将当前月销售额与基准值的比值转换为百分比并取整
  • 若不需要注释,直接保留Perc列即可,完全匹配预期结果的数值要求

方案二:兼容MySQL 5.x 版本(子查询关联)

如果你的MySQL版本不支持窗口函数,可以用子查询预先获取每个产品的1月基准销售额,再关联主表计算:

SELECT
    s.Prod_id,
    s.Mon,
    s.Sale,
    ROUND((s.Sale / p.pivot_sale) * 100) AS Perc,
    -- 可选:添加基准行注释
    CASE 
        WHEN s.Mon = 1 THEN CONCAT('100 - pivot for product ', s.Prod_id) 
        ELSE CAST(ROUND((s.Sale / p.pivot_sale) * 100) AS CHAR) 
    END AS Perc_with_note
FROM
    sales_table s
JOIN (
    -- 子查询获取每个产品1月的销售额
    SELECT Prod_id, Sale AS pivot_sale
    FROM sales_table
    WHERE Mon = 1
) p ON s.Prod_id = p.Prod_id
ORDER BY
    s.Prod_id, s.Mon;

代码说明:

  • 子查询p先筛选出所有产品1月的销售额数据
  • 主表s通过Prod_id与p关联,用当前月销售额除以基准值计算占比
  • 同样支持添加基准行的注释文本,完全贴合预期输出格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:07:51