【问题标题】:Runing Total sum minus different condition运行总和减去不同条件
【发布时间】:2017-06-22 08:37:56
【问题描述】:

我查看了一些运行总示例的 SQL Server,但我无法管理这样的事情。

我有一个表,其中有列 id、名称、操作类型、日期、值。 我想计算每条记录的余额。余额应该这样计算:

起始余额必须为0,然后如果操作类型为IN,则为加号,如果为OUT,则为减号。每个下一条记录都应该看到上一条记录的余额,然后根据操作类型查看 +value 或 -value。

此操作应按日期(而不是 Id)排序。

例如,如果表格如下所示:

ID Name  Op_Type Date       Value
1  box   Out     2017-05-13 15
2  table In      2017-04-31 65
3  box2  In      2017-05-31 65

那么结果应该是这样的

ID Name  Op_Type Date       Value Balance
2  table In      2017-04-31 65     65
1  box   Out     2017-05-13 15     50
3  box2  In      2017-05-31 65     115

这段代码的结果:

select *,
       sum(case when Op_Type = 'Out' then -Value else Value end)Over(Order by [Date]) as Balance
From Yourtable

是:

ID  Date        Type        Value       Balance
143 2016-12-31  In          980         664.75
89  2016-12-31  Out         300         664.75
90  2016-12-31  Out         80          664.75

但我希望得到以下结果:

ID  Date        Type        Value       Balance
143 2016-12-31  In          980         980
89  2016-12-31  Out         300         680
90  2016-12-31  Out         80          600

【问题讨论】:

  • 请使用标点符号,这道题是一个长句,看不懂。你试过什么吗?网上有很多关于如何计算运行总计和条件聚合的教程。另外,你用的是哪个版本的sql-server?
  • 这是用于什么平台的?是否适用于 RDBMS?
  • 是的,我尝试过一些东西,但在大多数情况下,我在某些行中得到了错误的数字或类似的东西:/它不是用前一行计算
  • @Wuhu - 所有日期都相同。你期待的结果是什么/
  • 0+980-300-80 这就是我想要的

标签: sql sql-server


【解决方案1】:

Prdp 回答的问题是SUM(...) OVER (ORDER BY ...) 默认使用RANGE 选项而不是ROW

这就是当日期不唯一时您会看到意外结果的原因。这就是默认的RANGE 选项的工作原理。

要获得您期望的结果,请明确拼写:

SELECT
    *
    ,SUM(CASE WHEN Op_Type = 'Out' 
        THEN -Value ELSE Value END)
    OVER(ORDER BY [Date], Op_Type, ID
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance
FROM YourTable
ORDER BY [Date], Op_Type, ID;

我还在ORDER BY 中添加了Op_Type,以便在多行具有相同日期的情况下首先添加正值。

我在ORDER BY 中添加了ID,以便在多行具有相同日期的情况下使结果稳定。

【讨论】:

  • 1 个问题它工作正常,但是当我指向 SELECT * ,SUM(CASE WHEN Op_Type = 'Out' THEN -Value ELSE Value END) OVER(ORDER BY [ Date], Op_Type, ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance From YourTable ORDER BY [Date], Op_Type, ID where date>=2017-01-05 AND date
  • @Wuhu,基本上你需要运行两个查询。首先是一个简单的SUM(不是总数),从时间开始到2017-01-05。记住计算的总和,然后将其与运行总计一起添加到主查询中的每一行。
猜你喜欢
  • 2018-05-12
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多