登録してからユーザーの支払いを含む合計金額があります。 登録日から毎年、ユーザーはプレミアムメンバーシップを支払わなければなりませんが、同じ年に払う必要はありません。ユーザーはeを支払うことができます。例えば。 3年前に戻るまたは、今後3年間は前もって。ユーザーが払うべき値です期間の支払いを分割する
year | rate
2014 | 100
2015 | 100
2016 | 50
2017 | 150
2018 | 100
を次のように年間の
料金です。しかし、必要以上に少ない金額を譲渡することができます。ユーザーが438 $を支払ったとしましょう。彼がこれをしたときは問題ではない。それは2014年または今年になる可能性があります。 2014年から今年までの手数料です。
私がしたいことは、支払われるべきすべてのものがあることを確認するために支払われる必要がある毎年の彼の移転(計算され、変数に格納される)の合計金額を分割することです。私が取得したいと思い
結果:
year | rate | payed
2014 | 100 | 100
2015 | 100 | 100
2016 | 50 | 50
2017 | 150 | 150
2018 | 100 | 38
だから、ユーザーがすべてを払ったことに彼が最新でなければならず、38 $過剰支払いを持っています。
ループ/カーソルを使用することはできますが、使用するウィンドウ機能を考えることはできません。何かヒント?この場合、Googleに問い合わせる方法が見つかりません。
サンプル(ソリューションは、作業が、窓関数と同等を探している)
DECLARE @total DECIMAL = 438
;WITH data AS
(
SELECT *, @total - (SELECT SUM(tt.rate) FROM
(VALUES
(2013, 100),
(2014, 100),
(2015, 100),
(2016, 100),
(2017, 100),
(2018, 100)) tt([Year], Rate)
WHERE tt.[Year] < t.[Year]) AS Payed
FROM (VALUES
(2013, 100),
(2014, 100),
(2015, 100),
(2016, 100),
(2017, 100),
(2018, 100)) t([Year], Rate)
),
prepared AS
(
SELECT d.[Year], @total AS Total, d.Rate,
CASE
WHEN ISNULL(d.Payed, d.Rate) <= 0 THEN NULL
WHEN @total < d.Rate THEN @total ELSE ISNULL(d.Payed, d.Rate)
END AS Payed
FROM data d
)
SELECT p.[Year], @total AS Total, p.Rate,
CASE
WHEN p.Payed >= p.Rate THEN p.Rate
ELSE p.Payed
END Payed
FROM prepared p
? "1年ごとの彼の移籍の総額を分けて、彼はすべてが支払われたことを確認する"と言ってください。なぜ私たちは分裂していますか?何が支払われたかを見るために年間の送金額を合計したくないですか?道に迷いました。あなたの質問を明確にするのに役立つテーブルの表示、サンプルデータ、期待される結果を検討してください。 – xQbert
サンプルコードと追加の説明が追加されました – lszk