如何在SQL视图中执行累积减法?

时间:2015-03-11 00:03:42

标签: sql-server sql-server-2014

我有一个包含两个字段的SQL视图。我想以每周计算减少余额。

TableID  item_no    Qty_shp     Qty_Stk  Balance    posting_date    
1        WTR234       28         500       472       2015/03/09
2        WTR234       42         472       430       2015/03/15
3        WTR234       100        500       400       2015/03/16
4        WTR234       50         400       350       2015/03/22

如上表所示,我需要能够按周计算这些项目的余额,因为Qty_Stk会在星期一的新周开始时恢复为新值。


来自OP的评论

TableID item_no Qty_shp Qty_O   Qty_Stk Balance posting_date    
1       WTR234  28      500     500     472     2015/03/09  
2       WTR234  42      500     472     430     2015/03/15  
3       WTR234  100     500     500     400     2015/03/16  
4       WTR234  50      500     400     350     2015/03/22

1 个答案:

答案 0 :(得分:1)

这可以使用带有sum()子句的聚合函数over ()来解决。在查询中,我只根据周分区数据,但如果有多个产品,也许你想要将item_no作为分区的一部分。

我认为这个查询应该会给你正确的结果(它使用你有限的样本数据为我做了)。

编辑:我在尝试时使用了设置SET DATEFIRST 1

select 
    TableID,
    item_no,
    Qty_shp,
Qty_Stk = qty_o - isnull(
   sum(qty_shp) over (
      partition by datepart(week, posting_date) 
      order by posting_date 
      rows between unbounded preceding and 1 preceding
      )
   ,0),
    Balance = qty_o - sum(qty_shp) over (
       partition by datepart(week, posting_date) 
       order by posting_date
    ),
    posting_date    
from your_table

这给了我以下输出:

TableID     item_no    Qty_shp     Qty_Stk     Balance     posting_date
----------- ---------- ----------- ----------- ----------- ------------
1           WTR234     28          500         472         2015-03-09
2           WTR234     42          472         430         2015-03-15
3           WTR234     100         500         400         2015-03-16
4           WTR234     50          400         350         2015-03-22