0

計算列を毎日更新するストアドプロシージャの作成に追われています。残念ながら、ストアドプロシージャに関する私の知識は限られていますが、適切な場所のようです。私はより多くの背景情報を提供しようとしています:

メインテーブルはクレームを格納し、tabDataと呼ばれます。データ型bit(boolean)の列'IsReturn'があります。

1.ルール:列値fimaxActionCodeがこれらの1、2、3、4、5、8、9、12、14、17、18、20、21、22、23、24のいずれかである場合、クレームはリターンです。 、25、30、31、32、35。

2.ルール:fimaxActionCodeが8、10、11、13、19、23、24、26の以前のクレーム(日付値とIMEI(携帯電話のID番号)で識別される)がある場合、クレームは返品ではありません、27、28、29、30、33、34、36、37 in fiClaimeStatus 1、4、6、254、255。

最初のReturn-Ruleは古いものであり、ssasキューブの計算列として実装されています。今はもっと複雑になっているので、毎朝実行されるストアドプロシージャにその計算を入れたほうがいいと思いました。

これは、候補のクレーム(ルール1)がルール2で失敗するかどうかを確認する必要があるものです。以前のすべてのクレームを選択するビュー「PrevClaim」を作成しました。

SELECT     TOP (100) PERCENT Claim.idData AS ClaimID, PrevClaim.idData AS PrevClaimID, Claim.IMEI, 
                      Claim.Repair_Completion_Date AS ClaimRepDate, PrevClaim.Repair_Completion_Date AS PrevClaimRepDate, 
                      PrevClaim.fimaxActionCode AS PrevFiMaxActionCode, PrevClaim.fiClaimStatus AS PrevFiClaimStatus, Claim.IsReturn AS ClaimIsReturn
FROM         dbo.tabData AS Claim INNER JOIN
                      dbo.tabData AS PrevClaim ON Claim.IMEI = PrevClaim.IMEI AND Claim.idData <> PrevClaim.idData AND 
                      Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date
ORDER BY PrevClaimRepDate DESC

このsql-statementを使用して、特定のIDの最後のParent-Claimを取得できます(このクレームはルール2に対して検証する必要があります)。

SELECT     TOP (1) ClaimID, PrevClaimID, IMEI, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM         PrevClaim
WHERE     (ClaimID = 44921287)
ORDER BY PrevClaimRepDate DESC

しかし、今では、この親クレームがルール2で失敗したクレームであるかどうかを確認する方法/場所がわかりません。このSQLを変更し、条件をwhere句に入れると、間違ったクレームが発生します(4つの親クレームがあると考えてください)。 、最後の時間は問題ありませんが、4番目は失敗します。したがって、4番目を取り戻しますが、最後の時間と照合する必要があります):

SELECT     TOP (1) ClaimID, PrevClaimID, ClaimRepDate, PrevClaimRepDate, PrevFiMaxActionCode, PrevFiClaimStatus
FROM         PrevClaim
WHERE     (ClaimID = 44921287) AND (PrevFiMaxActionCode IN (8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37)) AND (PrevFiClaimStatus IN (1, 4, 254, 255, 6))
ORDER BY PrevClaimRepDate DESC

私は輪になって行くか、多分そのようなものには暑すぎます。誰かが私を正しい方向に導いてくれること、および/またはストアドプロシージャにそれを実装する方法を教えてくれることを願っています(UPDATE ... CASEしかしどのように?)。

編集:私は今正しい軌道に乗っていると思います。たぶん誰かが1つのSQLステートメントでテーブル全体を更新する方法を教えてくれるかもしれません。次のユーザー定義関数は私に正しい値を与えます:

    SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo._isClaimReturn 
(
    @claimID  int,
    @fimaxActionCode int
)
RETURNS int
AS
BEGIN
 DECLARE @isReturn int

  IF(@fimaxActionCode in (1, 2, 3, 4, 5, 8, 9, 12, 14, 17, 18, 20, 21, 22, 23, 24, 25, 30, 31, 32, 35))
  AND (SELECT     TOP (1) PrevFiMaxActionCode
  FROM   PrevClaim
  WHERE     (ClaimID = @claimID))IN(8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37)
  AND 
  (SELECT     TOP (1)PrevFiClaimStatus
  FROM         PrevClaim
  WHERE     (ClaimID = @claimID))IN(1, 4, 254, 255, 6)
  BEGIN
   Set @isReturn = 0
  END
 ELSE
  BEGIN
   Set @isReturn = 1
  END 

 RETURN @isReturn

END
GO

別の質問:1つのクエリのみを使用することは可能ですか?私の関数では、PrevClaim-Viewで2つのクエリを使用して、Prev.Claimがクリティカル状態にあり、クリティカルなMaxActioncodeがあるかどうかを確認します。

4

2 に答える 2

1

次の線に沿った何かがあなたが探しているものでしょうか?

UPDATE tabData TD1
    SET TD1.IsReturn = 1
    WHERE TD1.fimaxActionCode IN (1, ...etc... , 35) AND
          NOT EXISTS (SELECT *
                          FROM tabData TD2
                          WHERE TD1.IMEI = TD2.IMEI AND
                                TD2.fimaxActionCode IN (8, ...etc... , 35) AND
                                TD2.fiClaimStatus   IN (1, 4, 254, 255, 6) AND
                                TD2.Repair_Completion_Date > TD1.Repair_Completion_Date);

私が最初のルールだと思うのはそのWHERE TD1.fimaxActionCode IN (1, ...etc... , 35)部分です。NOT EXISTS内のクエリは、2番目のルールをチェックすることを目的としています。私が少し間違っている場合は、正しい解決策への道を見ることができるかもしれません。私が完全に間違っている場合...ええと...まあ、私はあなたを間違った方向に送り出してあなたの時間を無駄にしないことを願って、何かを整理しようとします。

最初のコメントを考慮して編集されました。

于 2010-07-08T16:23:27.550 に答える
1

編集でリストしたUDFを使用する新しい計算列を作成できます。これにより、値が常に最新になります。

于 2010-07-08T17:55:13.257 に答える