MySQL 5.6中实现列累计求和及衍生值计算的方法(已尝试变量未成功)
解决MySQL 5.6累计求和及衍生计算问题
你的需求是计算quantity 1和total 1的累计值,再通过累计total除以累计quantity得到value summ,原SQL存在字段名未转义、变量未初始化、累计逻辑不完整等问题,以下是修正后的方案:
关键问题说明
- 带空格的字段名必须用反引号包裹(比如
quantity 1、total 1),否则MySQL无法识别。 - MySQL 5.6不支持窗口函数,需用用户变量实现累计,且必须初始化变量,同时指定明确的行排序规则(否则累计结果无意义)。
- 需同时维护累计quantity和累计total两个变量,再基于这两个累计值计算
value summ。
修正后的SQL语句
假设你的表有一个用于排序的字段(比如id,确保行顺序符合你的累计逻辑),执行以下语句:
SET @sum_quantity = 0; SET @sum_total = 0; SELECT `quantity 1`, `value 1`, `total 1`, @sum_quantity := @sum_quantity + `quantity 1` AS `sum quantity`, @sum_total := @sum_total + `total 1` AS `sum total`, ROUND(@sum_total / @sum_quantity, 4) AS `value summ` FROM your_table ORDER BY id; -- 替换为你实际的排序列(如时间、自增ID等)
执行结果示例
以你提供的数据为例,执行后会得到符合预期的结果:
| quantity 1 | value 1 | total 1 | sum quantity | sum total | value summ |
|---|---|---|---|---|---|
| 80 | 3.8 | 304 | 80 | 304 | 3.8000 |
| 40 | 3.75 | 150 | 120 | 454 | 3.7833 |
| 40 | 3.8 | 152 | 160 | 606 | 3.7875 |
单语句初始化变量的写法
如果不想单独执行SET语句,可以用子查询完成变量初始化:
SELECT `quantity 1`, `value 1`, `total 1`, @sum_quantity := @sum_quantity + `quantity 1` AS `sum quantity`, @sum_total := @sum_total + `total 1` AS `sum total`, ROUND(@sum_total / @sum_quantity, 4) AS `value summ` FROM your_table, (SELECT @sum_quantity := 0, @sum_total := 0) AS init ORDER BY id;
内容的提问来源于stack exchange,提问作者DarkFenix
相关产品推荐
相关产品推荐

