SQL Server按月分区运行余额

时间:2017-01-02 13:49:30

标签: sql sql-server window-functions

我有以下情况,即用户每个月都会获得一些补贴,直至每年一次。

我已成功实现此功能,如here

所示

我遇到了一个问题,如果用户在这一年内获得晋升,则需要相应地批准年度上限。

以下查询给出了这些结果。 (使用sql server 2012)

SELECT *,
       RemainingBalance = AnnualCapping - Sum(amount)
                                            OVER (
                                              partition BY userid, year, annualcapping
                                              ORDER BY userid, year, month)
FROM   exampleTx
WHERE  userid = 1
       AND year = 2015 

数据

userId  year    month   monthname   name    surname annualCapping   amount  RemainingBalance
1       2015    1       January     Joe     Black   500,00          40,00    460,00
1       2015    2       February    Joe     Black   500,00          40,00    420,00
1       2015    3       March       Joe     Black   500,00          40,00    380,00
1       2015    4       April       Joe     Black   500,00          40,00    340,00
1       2015    5       May         Joe     Black   500,00          40,00    300,00
1       2015    6       June        Joe     Black   500,00          40,00    260,00
1       2015    7       July        Joe     Black   500,00          40,00    220,00
1       2015    8       August      Joe     Black   500,00          40,00    180,00
1       2015    9       September   Joe     Black   1000,00         40,00    **960,00**  
1       2015    10      October     Joe     Black   1000,00         40,00    **920,00**
1       2015    11      November    Joe     Black   1000,00         40,00    **880,00**
1       2015    12      December    Joe     Black   1000,00         40,00    **840,00**

9月份每月津贴应与年度剩余量成比例。

4 months = 1000 * 4/12 = 333.33

余下293.33, 253.33, 213.33,173.33

我可以在不修改年度上限字段的情况下实现这一目标。如果年度上限减少到333.33,那将会更简单,但这是我的数据。

上个月的上限变化表明促销已经发生。它可以在任何一个月发生。因此新的封顶应该是成比例的。

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询

Select *,
RemainingBalance = AnnualCapping - SUM(amount) OVER (
partition  by userid ,year ORDER BY userid, year,month) 
 from
 exampleTx
 where userid = 1 and year = 2015

从Partition by子句中删除年度上限。