【问题标题】:How to get correct cumulative balance?如何获得正确的累积余额?
【发布时间】:2021-01-30 20:33:17
【问题描述】:

我有这个简单的查询

select ArticleID, Prix, Qte, InfStock
    , SUM(Qte*InfStock) OVER (Partition BY ArticleID ORDER BY DateDocument) AS CUMUL
FROM Balance

请看结果(第 4 行) Here is the backup file(zipped)

【问题讨论】:

  • 请不要使用图像作为数据,使用格式化文本。如果您以 DDL+DML 的形式发布示例数据,人们可以更轻松地为您提供帮助。
  • 不,在我看来,是不是bug,我只有Sql express 2014 SP1,数据库文件是否损坏?,整个结果大约是501K行。
  • 您需要向我们展示 InfStock 和 DateDocument 以便我们了解问题所在。可能您与日期列有联系,在这种情况下您需要知道默认值是 RANGE 而不是 ROWS
  • 要解决问题,请在选择列表中包含DateDocument,并在查询末尾添加ORDER BY ArticleID, DataeDocument
  • @saimmm0710 我们不想要你的备份文件,我们想要一个强调minimalminimal reproducible example。此外,我认为您提供的答案和 cmets 足以解决问题。

标签: sql sql-server sql-server-express


【解决方案1】:

您需要在OVER 子句的末尾添加ROWS UNBOUNDED PRECEDING

SUM 默认为 RANGE UNBOUNDED PRECEDING,这可能会导致此类问题。

例如,请参阅here 以获得进一步的解释。

【讨论】:

  • 和/或向ORDER BY添加一个决胜局,因此它始终是唯一的/确定的
  • 非确定性是一个单独的问题。每次可能返回不同的结果,但每个结果基本上都是正确的。如果没有ROWS,结果就是错误的EDIT是的,你可以通过确定性来解决这个问题,但这实际上只是一个hack。
  • 这不是一个单独的问题 - 当ORDER BY 子句中有联系时,RANGEROWS 之间的结果差异就会发挥作用。因此,如果无法建立联系,它们的行为将相同(结果明智)。在某些情况下,指定 ROWS 仍然有性能优势(在 2014 年,使用 ROWS 总是会有更好的性能)
  • 还需要“您还需要按DateDocument排序查询,以确保运行余额与列出的记录顺序相同。”对吗?
  • @saimmm0710 AND CURRENT ROW 无论如何都是默认的,所以你可以写ROWS UNBOUNDED PRECEDING
猜你喜欢
  • 2020-10-05
  • 2021-01-17
  • 2018-09-05
  • 2022-01-18
  • 2019-11-18
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多