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

MySQL 5.7计算列avg_month结果写入下一行问题求助

解决MySQL 5.7中avg_month列结果错位问题

问题出在用户变量的执行顺序不明确上,MySQL 5.7不保证SELECT子句里表达式的执行顺序,加上GROUP BY的分组处理逻辑,导致@avg_month引用的是上一行的@qty_mth和@count_mth值,所以结果错位到下一行。

直接用下面两种方案解决:

方案1:去掉用户变量(推荐)

不需要用变量存储中间聚合结果,直接基于聚合函数计算avg_month,逻辑更清晰且无顺序问题:

CREATE TABLE tbl_temp_si_trans4 
(temp_si_trans4id INT NOT NULL AUTO_INCREMENT,  
PRIMARY KEY temp_trans4idkey (temp_si_trans4id), 
INDEX index1 (order_month,SKU))
SELECT 
  order_month,  
  SKU, 
  SUM(net_qty_after_refund) AS qty_mth, 
  COUNT(DISTINCT order_year) AS count_mth, 
  SUM(net_qty_after_refund)/COUNT(DISTINCT order_year) AS avg_month
FROM order_trans4
GROUP BY order_month, SKU;

方案2:用子查询先聚合再处理变量

如果一定要保留变量逻辑,先通过子查询完成分组聚合,再在外部查询中使用变量计算平均,确保变量引用的是当前行的聚合值:

CREATE TABLE tbl_temp_si_trans4 
(temp_si_trans4id INT NOT NULL AUTO_INCREMENT,  
PRIMARY KEY temp_trans4idkey (temp_si_trans4id), 
INDEX index1 (order_month,SKU))
SELECT 
  order_month,
  SKU,
  @qty_mth := qty_mth AS qty_mth,
  @count_mth := count_mth AS count_mth,
  @qty_mth/@count_mth AS avg_month
FROM (
  SELECT 
    order_month,
    SKU,
    SUM(net_qty_after_refund) AS qty_mth,
    COUNT(DISTINCT order_year) AS count_mth
  FROM order_trans4
  GROUP BY order_month, SKU
) AS agg_data;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:15:39