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

