2017-01-02 37 views
-1

我有以下情况,用户每月需要花费一些配额,直至达到年度上限。SQL Server按分区运行余额并按月分配

如图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** 

在九月的每月津贴应该是成正比的剩余一年。

4 months = 1000 * 4/12 = 333.33 

和剩余余额293.33, 253.33, 213.33,173.33

我是否可以在不修改年度封顶场的情况下实现这一目标。即如果年度上限减少到333.33,那么e会更简单,但这是我拥有的数据。

上个月的上限变化表示已经发生了晋升。它可以在任何月份发生。因此新的上限应该是成比例的。

+0

您如何识别用户何时升职?是在不同的表中的信息?对所有用户来说都是一样的规则? –

+0

在此示例中,年度上限被添加以表示促销。它实际上来自另一张桌子。共享的sql文件包含一个可以使用的简单示例。对于同一用户,同样的规则, – NotForFun

+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 

除去每年从by子句分区封盖。