計算列を毎日更新するストアドプロシージャの作成に追われています。残念ながら、ストアドプロシージャに関する私の知識は限られていますが、適切な場所のようです。私はより多くの背景情報を提供しようとしています:
メインテーブルはクレームを格納し、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があるかどうかを確認します。