2017-01-02 21 views
-1

次のようなシナリオを考えています。 here月ごとのパーティションとのSQL Serverの実行残高

を示すよう

が、私はこれを正常に実施している私は、ユーザーが毎年キャップがそれに応じて批准する必要が今年中に推進してしまった場合のために、問題につまずいてきました。

これらの結果は次のとおりです。 9月に

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

を(SQL Serverの2012を使用して)毎月の手当は、今年の残りに比例している必要があります。

4 months = 1000 * 4/12 = 333.33 

残り残量は293.33, 253.33, 213.33,173.33です。

年次の上限フィールドを変更せずにこれを達成できますか。すなわち、毎年のキャッピングが333.33に縮小された場合、eはよりシンプルになりましたが、これは私が持っているデータです。

前月のキャッピングが変更された場合は、プロモーションが行われたことを示します。それは任意の月に発生する可能性があります。したがって、新しいキャッピングは比例する必要があります。

+0

ユーザーの昇格の仕組みをどのように特定しますか?それは別のテーブルの情報ですか?すべてのユーザーで同じルールですか? –

+0

この例では、プロモーションに信号を送るために、年間キャッピングが追加されています。実際には別のテーブルから来ています。共有されたSQLファイルには、使用できる簡単な例が含まれています。同じユーザーのための同じルール、 – NotForFun

+0

それは常に最後の4ヶ月比例calcを持っていますか? –

答えて

0

あなたは、PARTITION BY句から年間キャッピングを削除し、次のクエリ

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

を使用することができます。

関連する問題