【问题标题】:Set negative cumulative sum to zero Can someone advise the best approach to do this? [duplicate]将负累积总和设置为零有人可以建议最好的方法吗? [复制]
【发布时间】:2018-07-31 12:21:23
【问题描述】:

我有一个包含负值和正值的金额列的表。我想计算值的总和并将负累积总和设置为零。

date        amount  actu_cusum  exp_cusum
22-06-2018  60.626   60.626      60.626
29-06-2018  -78.309 -17.683       0
02-07-2018  -0.824  -18.507       0
09-07-2018  -0.822  -19.329       0
10-07-2018  14.79   -4.539       14.79
29-07-2018  20      15.461       34.79
30-07-2018  -30     -24.539      4.79
31-07-2018  15      -9.539       19.79


update a set a.calamount= z.cusum
from #temp a, 
( select CustomerCode,  date ,amount, 
SUM(totaumamount) over ( partition by CustomerCode order by date )
as cusum from #temp
) z
where a.customercode = z.customercode and a.date = z.date

【问题讨论】:

  • 这是什么“SQL”?你的 DBMS 是什么? “SQL”只是许多 DBMS 使用的一种查询语言。
  • 看起来很像 SQL-Server。示例数据部分中似乎缺少您的列 customercode
  • 挑战是计算那些预期的 [exp_cusum] 结果吗?如果是这样,那么这个问题并不像锁定这篇文章的那个重复问题那么简单。它应该重新打开。

标签: sql sql-server


【解决方案1】:

(您的问题中缺少列和表) 您可以使用:

... set a.calamount = case when z.cusum < 0 then 0 else z.cusum end ...

编辑:对于个别负值:

update a set a.calamount= z.cusum
from #temp a, 
( select CustomerCode,  date ,amount, 
SUM(case when totaumamount < 0 then 0 else totaumamount end) over ( partition by CustomerCode order by date )
as cusum from #temp
) z
where a.customercode = z.customercode and a.date = z.date

【讨论】:

  • 我已经应用了这个案例,但结果不匹配,因为 cusum 包含该案例的先前值结果是新结果应用案例函数 60.626 0 0 0 -4.539 15.461 -24.539 -9.539
  • @Ashwini,对不起,我不明白你的意思。您能否提供一些具有预期输出的示例数据。您是否尝试将结果设置为 0 或每个单独的值?我也会针对个人价值观编辑我的答案。
  • 日期金额 actu_cusum exp_cusum 22-06-2018 60.626 60.626 60.626 29-06-2018 -78.309 -17.683 0 02-07-2018 -0.824 -18.507 0 31-07-2018 15 -想将 actu_cusum 列的负和设置为零,它应该为下一条记录选择零,但在这种情况下,它选择负记录,所以我没有得到正确的输出
猜你喜欢
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2010-11-29
  • 2019-04-07
  • 1970-01-01
相关资源
最近更新 更多