MySQL累积总和给出了错误的结果

时间:2017-02-19 20:15:28

标签: mysql cumulative-sum

以下是我的table示例,其中包含一些示例数据 -

奇怪的事情发生在gorivo.PovratKM和gorivo.PolazakKM列之间的累积差异时,gorivo.UkupnoGorivo也是如此。

对于 gorivo.PovratKM gorivo.PolazakKM 之间的差异以及 gorivo的累积总和,累积总和位于 SumUkKM 列中.UkupnoGorivo 是专栏 SumGorivo

输出应该是这样的:

+-------------+------------+-------------+------------+  
| Polazak KM  | Povratal KM| Prijedeno KM|  SumUkKM   |
+-------------+------------+-------------+------------+  
| 814990      | 816220     |      1230   |    1230    |                 
+-------------+------------+-------------+------------+
| 816220      | 817096     |      876    |    2106    |                 
+-------------+------------+-------------+------------+
| 817096      | 817124     |      28     |    2134    |                 
+-------------+------------+-------------+------------+
| 817124      | 818426     |      1302   |    3436    |                 
+-------------+------------+-------------+------------+

我在查询中做错了什么?

1 个答案:

答案 0 :(得分:2)

MySql允许在sql语句中声明变量,(select @SumUkGorivo := 0, @SumUkKM := 0) x CROSS JOIN允许计算其他表的每一行的值。

使用变量,您可以使用与SUM() OVER (PARTITION BY相同的方式设置重置点或分区,而不是其他dmb,如SQL或Postgres。

SELECT 
   y.`PolazakKM`, y.`PovratakKM`,
   @SumUkGorivo := @SumUkGorivo + `UkupnoGorivo` as SumUkGorivo,
   @SumUkKM := @SumUkKM + (y.`PovratakKM` - y.`PolazakKM`) as SumUkKM
FROM 
    (select @SumUkGorivo := 0, @SumUkKM := 0) x,
    (select gorivo.`PolazakKM`, gorivo.`PovratakKM`, gorivo.`UkupnoGorivo`
     from gorivo WHERE gorivo.`IDVozilo` = 131
     order by `DatumT`) y
;