【问题标题】:Subtract accumulated values in SQL Server 2008减去 SQL Server 2008 中的累积值
【发布时间】:2014-01-22 21:57:50
【问题描述】:

我有一台 ATM 机,其信息如下:

-   --Date-----|--Withdraw---|---CashLoad
-   01/15/13--|----10----------|-------300
-   01/16/13--|----20
-   01/17/13--|----50
-   01/18/13--|---120
-   01/19/13--|----20----------|-------400
-   01/20/13--|----60
-   01/21/13--|----80
-   01/22/13--|----50
-   01/23/13--|----90----------|------300

我想计算该 ATM 的日终余额,该余额等于 CashLoad - 每天累积的提款金额。如果 ATM 被重新加载,该过程将重新开始

这就是我要找的东西:

-   --Date------|--Withdraw---|------CashLoad---|--------EOD_Balance
-   01/15/13---|----10----------|-------300-----------|-----------290
-   01/16/13---|----20----------|-----------------------|-----------270
-   01/17/13---|----50----------|-----------------------|-----------220
-   01/18/13---|---120---------|------------------------|----------100
-   01/19/13---|----20----------|-------400-----------|-----------380
-   01/20/13---|----60----------|-----------------------|-----------320
-   01/21/13---|----80----------|-----------------------|-----------240
-   01/22/13---|----50----------|-----------------------|-----------190
-   01/23/13---|----90----------|-------300-----------|-----------210

这是我目前使用的查询:

select
    tmp1.atminternalid, tmp1.date,
    tmp1.CashLoad - tmp1.accum_disp as cashbalafterload
from mytable as tmp1 where SettlementDate = (select max(SettlementDate)
from DM_ADMIN.dbo.temptable1001 as tmp2
where tmp2.ATMInternalID = tmp1.atminternalid )
order by tmp1.atminternalid

如何更改我的查询以获得我正在寻找的结果?

【问题讨论】:

  • 你目前正在尝试什么?
  • 我创建了另一个名为 accum_Wtd 的列,然后我尝试使用 CashLoad 减去这些值。它还不行。 select tmp1.atmid, tmp1.date, tmp1.CashLoad - tmp1.accum_wtd as cashbalance from mytable as tmp1 where Date = (select max(Date) from mytable as tmp2 where tmp2.ATMID = tmp1.ATMID ) order by tmp1.ATMID
  • 将查询添加到问题中,因为知道这一点至关重要。欢迎来到 SO!

标签: sql sql-server-2008 subtraction accumulate


【解决方案1】:

SQL Server 2008 没有累积求和函数。您可以使用相关子查询来解决这个问题:

select atm.*,
       (select sum(cashload) - sum(withdraw)
        from atm atm2
        where atm2.date <= atm.date
       ) as EOD_Balance
from atm;

编辑:

嗯,这确实改变了问题。您需要从上一次现金加载的日期算起:

select atm.*,
       (select sum(cashload) - sum(withdraw)
        from atm atm3
        where atm3.date <= atm.date and
              atm3.date >= CashLoadDate
       ) as EOD_Balance
from (select atm.*,
             (select max(date)
              from atm atm2
              where atm2.date <= atm.date and
                    cashload > 0
             ) as CashLoadDate
      from atm
     ) atm;

【讨论】:

  • 感谢您的代码,戈登。但是,我忘了提到在新的现金加载之前,他们先取出剩余的现金,然后将新的金额加载到自动柜员机中。例如:2013 年 1 月 18 日,剩余现金为 100 美元,2013 年 1 月 19 日,他们拿走了那 100 美元,投入 400 美元,EOD_Balance 现在是 380 美元(400-20 美元)而不是(400 美元+100-20 美元)
  • 我试过了,但收到了一些错误消息。你能帮忙吗?谢谢你,戈登!消息 107,级别 15,状态 1,第 7 行列前缀“atm”与查询中使用的表名或别名不匹配。消息 4104,级别 16,状态 1,行 10 无法绑定多部分标识符“atm.date”。消息 8155,级别 16,状态 2,第 14 行没有为“atm”的第 1 列指定列名。消息 207,级别 16,状态 1,第 4 行无效的列名称“日期”。
  • @user3221030 。 . .这是在 SQL Fiddle (sqlfiddle.com/#!3/d41d8/28810) 中工作的代码示例。这与答案中的代码完全相同。
  • 我明白了,戈登!非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2015-04-28
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多