MySQL按时间条件统计AR列累计值填充对应列求助
前提说明
累计求和要求行的先后顺序是可确定的,建议先给你的表增加一个自增主键字段id,用来明确排序规则,避免结果出现乱序。
MySQL 8.0+ 方案(推荐,语法更易理解)
使用窗口函数实现分组累计求和,代码如下:
SELECT `Time`, AR, CASE WHEN `Time` = '01:00' THEN SUM(AR) OVER (PARTITION BY `Time` ORDER BY id) ELSE 0 END AS `1`, CASE WHEN `Time` = '02:00' THEN SUM(AR) OVER (PARTITION BY `Time` ORDER BY id) ELSE 0 END AS `2`, CASE WHEN `Time` = '03:00' THEN SUM(AR) OVER (PARTITION BY `Time` ORDER BY id) ELSE 0 END AS `3` FROM 你的表名 ORDER BY id;
逻辑说明:PARTITION BY Time会将相同时间的行分为一组,ORDER BY id保证按行的插入顺序累加,CASE判断当前行时间匹配时返回累计值,否则返回0。
MySQL 5.x 兼容方案
如果使用不支持窗口函数的低版本MySQL,可以用用户变量实现:
SELECT `Time`, AR, CASE WHEN `Time` = '01:00' THEN @sum1 := @sum1 + AR ELSE 0 END AS `1`, CASE WHEN `Time` = '02:00' THEN @sum2 := @sum2 + AR ELSE 0 END AS `2`, CASE WHEN `Time` = '03:00' THEN @sum3 := @sum3 + AR ELSE 0 END AS `3` FROM 你的表名, (SELECT @sum1 := 0, @sum2 := 0, @sum3 := 0) AS init_var ORDER BY id;
逻辑说明:初始化三个变量分别记录三个时间点的累计和,遍历行时如果匹配对应时间就累加变量,否则返回0。
注意事项
- 数字作为列名时需要用反引号(`)包裹,避免MySQL识别为常量抛出语法错误。
- 如果你没有使用自增id作为排序依据,需要替换
ORDER BY后的字段为能唯一确定行先后顺序的字段组合,否则累计结果会不符合预期。
内容的提问来源于stack exchange,提问作者MihaiOW
相关产品推荐
相关产品推荐

