0

我坚持创建一个应该每天更新计算列的存储过程。不幸的是,我对存储过程的了解有限,但它似乎是正确的地方。我尝试提供更多背景信息:

主表存储声明,称为 tabData。它有一列“IsReturn”,数据类型为位(布尔)。

1.Rule:当它的列值fimaxActionCode是1、2、3、4、5、8、9、12、14、17、18、20、21、22、23、24之一时,它是一个Return , 25, 30, 31, 32, 35。

2.Rule :如果之前的索赔(通过日期值和 IMEI(手机的 Id-Number)标识,fimaxActionCode 为 8、10、11、13、19、23、24、26),则索赔不是退货, 27, 28, 29, 30, 33, 34, 36, 37 在 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 语句获取给定 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 个父声明,最后一次没问题,但第四次失败,因此我会得到第四次,但必须对照最后一次检查):

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

我要绕圈子了,或者它对这样的事情来说太热了。我希望有人可以引导我朝着正确的方向前进和/或可以向我展示如何在存储过程中实现它的方式(更新...案例但如何?)。

编辑:我认为我现在走在正确的轨道上。也许有人可以告诉我如何在一个 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

另一个问题:是否可以只使用一个查询?在我的函数中,我在 PrevClaim-View 上使用两个查询来检查 Prev.Claim 是否处于临界状态并具有临界 MaxActioncode。

4

2 回答 2

1

You can create a new calculated column that uses the UDF you have listed in your edit. This would ensure the value is alway up to date.

于 2010-07-08T17:55:13.257 回答
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 中的查询旨在检查第二条规则。如果我稍有错误,您可能会找到正确解决方案的方法。如果我完全错了......呃......好吧,我们会尝试解决一些问题,希望我不会让你走错方向并浪费你的时间。

编辑考虑到第一条评论。

于 2010-07-08T16:23:27.550 回答