mysql - 在可能存在空值的表上计算每 12 个月的累积值

标签 mysql date null sum

我有这张表:

Month       Year         MV                    MI         fullDate
-----------------------------------------------------------------
...
5           2015         1                      5         2015-05-01
6           2015         1                     10         2015-06-01
7           2015         3                     10         2015-07-01
8           2015         2                     10         2015-08-01
11          2015         1                     10         2015-11-01
1           2016         4                     10         2016-01-01
6           2016         1                     20         2016-06-01
7           2016         null                  10         2016-07-01
8           2016         2                      5         2016-08-01
...

我需要创建另一个包含累积值的表:

Month       Year         AMV                  AMI
-----------------------------------------------------------------
...    
7           2015         3                     10
8           2015         5                     20
11          2015         6                     30
1           2016         10                    40
6           2016         11                    60
7           2016         0                     10
8           2016         2                     15
...

累积计算必须从每年的 7 月开始,到下一年的 6 月结束。在此示例中,累积字段从 2015 年 7 月开始“累积”,并于 2016 年 6 月结束。这些计算于 2016 年 7 月重新开始,为累积值“计算”另一个周期

我之前提出过类似的问题,但我刚刚发现了累积计算的“周期性”。还有一件事...第一个表上的某些值可能为 null,需要被视为 0。

请告诉我如何做到这一点?

最佳答案

我已经修改了@Sebastian 的查询。 init 也在查询中。计数器每年都会重置,并且 where 不是必需的

SELECT 
  (@amv:=IF(MONTH(fulldate)=7,MV, IF(ISNULL(MV), 0, @amv+MV))) AS AMV, 
  (@ami:=IF(MONTH(fulldate)=7,MI, IF(ISNULL(MI), 0, @ami+MI))) AS AMI, 
  fullDate
FROM 
  input
CROSS JOIN ( SELECT @amv := 0, @ami := 0) AS init
ORDER BY fullDate ASC;

示例

mysql> select * from input;
+----+------+------+------------+
| id | MV   | MI   | fullDate   |
+----+------+------+------------+
|  1 |    1 |   10 | 2015-08-01 |
|  2 |    2 |   20 | 2015-09-01 |
|  3 |    3 |   30 | 2015-07-01 |
|  4 |    8 |   33 | 2016-07-01 |
|  5 |    2 |    8 | 2016-08-01 |
+----+------+------+------------+
5 rows in set (0,00 sec)

mysql>     SELECT
    ->       (@amv:=IF(MONTH(fulldate)=7,MV, IF(ISNULL(MV), 0, @amv+MV))) AS AMV,
    ->       (@ami:=IF(MONTH(fulldate)=7,MI, IF(ISNULL(MI), 0, @ami+MI))) AS AMI,
    ->       fullDate
    ->     FROM
    ->       input
    ->     CROSS JOIN ( SELECT @amv := 0, @ami := 0) AS init
    ->     ORDER BY fullDate ASC;
+------+------+------------+
| AMV  | AMI  | fullDate   |
+------+------+------------+
|    3 |   30 | 2015-07-01 |
|    4 |   40 | 2015-08-01 |
|    6 |   60 | 2015-09-01 |
|    8 |   33 | 2016-07-01 |
|   10 |   41 | 2016-08-01 |
+------+------+------------+
5 rows in set (0,00 sec)

mysql>

关于mysql - 在可能存在空值的表上计算每 12 个月的累积值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147815/

相关文章:

ios - Objective-C 如何本地化持续时间 : "1 Year", "2 Years"、 "3 Years"等

Php代码只获取当前日期(系统日期)

java - super.onCreate() 改变了我的变量

php - PHP : mysqli_fetch_array() expects parameter 1 [closed]中的错误消息

java - 在 java 中解析自定义数据格式

python - 处理 PyMySql 异常 - 最佳实践

python - 空值和排序

lua - 为什么我的矩阵值为零?

php - 使用现有值 + 新值更新列

c# - 密码哈希算法及程序实际运行