支払いのテーブルを取得し、関連するテーブルに記載されている一連のルール (基本的には一連のバケット) に従ってそれらの支払いを分配しようとする SQLServer 2008 ストアド プロシージャを作成しています。ただし、分配 (支払い値をバケツに入れる) が、現在頭を悩ませている原因です。
テーブル Payments には支払う値が含まれており、テーブル Buckets は、支払われる初期値が使い果たされる (0 に達する) まで、各バケットにどれだけ入れるべきかがすべてであるとします。
次の表を例として使用します (各支払いに適したバケットを選択するための複雑な基準があるため、実際の使用例はもう少し不自然です)。
PaymentId Value BucketId MaxAmount
-------------------------- --------------------------------
1 16.5 1 5.5
2 7.0 2 10
3 8.3
支払い 1 の場合: 5.5 単位 (そのバケットの最大) がバケット 1 に、10 単位がバケット 2 に (11.5 はバケット 1 の残りですが、バケット 2 の最大値を超えています)、1 単位 (16.5 - 5.5 - 10) になります。 ) をバケット 3 に入れる必要があります。すべての支払いについて繰り返します。
これは、任意の命令型言語で簡単に実装でき、おそらく for/while ループを使用する SQL でも実装できますが、より良い方法があるかどうかを認識しようとしていました (移植性がなく、SQLServer 2005 以降に固有のものであっても)。
私は(主に再帰的なCTEについて)いくつかの調査を行いましたが、本当に素晴らしいものは何も思い浮かびません。SQL-fuを備えたStackOverflowersが頭から答えていると確信しているので、そこに出して見てみようと思いました...
どうもありがとうございました。