【问题标题】:MySQL cumulative sum gives wrong resultMySQL累积和给出错误的结果
【发布时间】:2017-02-19 20:15:27
【问题描述】:

这是我的table 的示例以及一些示例数据-

奇怪的事情发生在 gorivo.PovratKM 和 gorivo.PolazakKM 列和 gorivo.UkupnoGorivo 列之间的差异累积总和时。

gorivo.PovratKMgorivo.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    |                 
+-------------+------------+-------------+------------+

我在查询中做错了什么?

【问题讨论】:

    标签: mysql cumulative-sum


    【解决方案1】:

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

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

    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
    ;
    

    【讨论】:

    • 非常感谢!我不知道可以通过这种方式解决。
    • 很高兴能提供帮助。
    • @McNets 在 SQL 中做循环很有趣。你能分解一下这个查询的行为吗?您能否解释一下(select @SumUkGorivo := 0, @SumUkKM := 0) x, 被注释掉时的行为? - @SumUkkm 以 9854(这是差异的最终总和)而不是 0 开头。所以它像这样 11084 (9854+1230), 11960(9854+1230+876) ... 为什么?
    • 我想是因为我添加了order by DatumT。不幸的是,我删除了用于获取解决方案的 rextester.com。尝试删除 order 语句,它将从 0 开始。
    猜你喜欢
    • 2016-01-24
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多