1

この質問をする方法がわかりませんが、ここに行きます。ビジネスのすべての未払いの請求書をチェックし、必要に応じてサービス料金を追加する、毎晩実行する手順を作成しようとしています。未払いの請求書を照会し、作成日と現在の日付の間で datediff() をチェックする必要があります。次に、15 日または 30 日などの特定の値で、サービス料金を追加して残高を更新するために、他のテーブルにいくつかの挿入と更新を行う必要があります。私が読んだことから、ループは進むべき道ではありませんが、現在の請求書を追跡する方法や、大規模な更新ステートメントの中に挿入する方法がわかりません。ここに私が必要とするもののいくつかの疑似コードがあります

select * from invoice where ispaid = 0

set days = currentdate - invoicecreationdate

switch (days)

case 30

insert servicecharge
update invoice
update balance

case 60

insert servicecharge
update invoice
update balance due

case 90

insert servicecharge
update invoice
update balance

これが大したことではないことはわかっていますが、できる限りの助けを借ります。現在処理している請求書を知る必要がある各ケース内で実行するステートメントがいくつかあるため、これがループなしでどのように機能するかはわかりません

4

1 に答える 1

0

あなたの場合、ループはそれほど悪くはありません。ループを通過するたびに「期限切れ」ウィンドウに 30 日が追加され、各ウィンドウに適用可能なすべての行をセットとして処理するつもりのようです。それは良いことです。

または、次のようなものを使用して、適切な日付範囲を生成できます。

declare @Today as Date = GetDate();

select DateAdd( day, -( AgingDays + 30 ), @Today ) as StartDate,
  DateAdd( day, -( AgingDays + 1 ), @Today ) as EndDate, PenaltyPercent
  from ( values ( 30, 2 ), ( 60, 5 ), ( 90, 10 ) ) as PastDueIntervals( AgingDays, PenaltyPercent )

各範囲の追加データを運ぶように簡単に拡張できます。これをInvoiceテーブルに結合することにより、該当するすべての請求書を一度に処理できます。

テーブルのサイズによっては、請求書 ID、期限超過間隔、およびその他の適用可能なデータを含む一時テーブルを生成することが理にかなっている場合があります。そのテーブルは、3 つのテーブルすべてを更新するために使用される情報を提供するために使用できます。

便利なトリックはCASEUPDATEステートメントに a を含めることです。次に例を示します。

update I
  set WatchList = case when Aging >= 60 then 1 else WatchList end,
    ...
  from Invoices as I inner join
    #PastDueInvoices as PDI on PDI.InvoiceId = I.InvoiceId

これにより、請求書が 60 日以上期限を過ぎていることが一時テーブルに示されている場合はウォッチ リスト フラグが設定され、それ以外の場合は変更されません。

于 2013-06-07T18:45:07.627 に答える