2010-07-08 1 views
0

매일 계산 된 열을 업데이트해야하는 저장 프로 시저를 만드는 데 어려움을 겪고 있습니다. 아쉽게도 저장 프로 시저에 대한 지식이 제한되어 있지만 올바른 위치에있는 것으로 보입니다. 배경 정보를 더 제공하려고합니다 :저장 프로 시저

메인 테이블은 claim을 저장하며 tabData라고 불립니다. 그것은 데이터 유형이 bit (boolean) 인 컬럼 'IsReturn'을가집니다.

1.Rule : 클레임은 해당 열 값 fimaxActionCode가 1, 2, 3, 4, 5, 8, 9, 12, 14, 17, 18, , 22, 23, 24, 25, 30, 31, 32, 35

2.Rule는 : 그 날짜 값 및 IMEI 통해 식별 한 항을 (갖는 경우 제는 하지 반송이며 fiClaimeStatus 1, 4, 6, 254에서 fimaxActionCode가 8, 10, 11, 13, 19, 23, 24, 26, 27, 28, 29, 30, 33, 34, 36, 37 인 , 255.

첫 번째 리턴 규칙은 이전 규칙이었고 는 ssas 큐브에서 계산 된 열로 구현됩니다. 이제는 상황이 더 복잡해 졌기 때문에 매일 아침 실행되는 저장 프로 시저에 계산을 넣는 것이 더 좋을 것이라고 생각했습니다.

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 

내가 얻을 수 있습니다 : 내가보기 이전의 모든 주장을 선택 'PrevClaim'를 만든 :

내가이 후보의 주장 (규칙 1) 규칙이 실패하는지 확인해야합니다 것입니다 이 SQL 문에 주어진 ID에 대한 마지막 부모 - 주장 (이 주장은 규칙 2에 대해 검증해야 함) :

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

하지만 지금 나는이 부모 주장은 주장이라면 어디 확인하는 방법/잘 모릅니다 그 규칙 2에 실패합니다.이 SQL을 수정하고 조건을 where에 넣으면

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 

: 절 ​​내가 잘못된 주장을 얻을 것이다 (4 부모의 주장은, 시간에 마지막으로 확인하지만 네 번째 그러므로 내가 네 번째 다시 얻을 것이다하지만 마지막에 확인해야 실패가 고려) 나는 서클에 간다. 아니면 어쩌면 그렇게 뜨거운 것일 수도있다. 누군가 나를 올바른 방향으로 이끌 수 있고 스토어드 프로 시저 (UPDATE ... CASE)에서 구현하는 방법을 보여줄 수 있기를 바랍니다.

EDIT : 이제 나는 올바른 길을 가고 있다고 생각합니다. 어쩌면 누군가가 내게 하나의 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가 있는지 확인합니다.

답변

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 내의 쿼리는 두 번째 규칙을 확인하기위한 것입니다. 약간 잘못된 경우 정확한 해결책을 찾을 수 있습니다. 내가 완전히 잘못하면 ... 어 ...글쎄, 우리는 잘못된 방향으로 당신을 보내지 않고 당신의 시간을 낭비하지 않기를 바라면서 무엇인가를 정렬하려고 노력할 것이다.

첫 번째 의견을 고려하여 편집되었습니다.

+0

나는 이미 사용자 정의 함수로 올바른 값을 계산하는 방법에 대한 답을 주었다. 그래서 나는 규칙 1과 _isClaimReturn (idData) = 1 만 확인하면된다. 이 정보로 update-sql을 완성 할 수 있습니까? 어쩌면 당신은 또한 함수에서 다중 선택에 대한 나의 마지막 질문에 대한 답을 얻을 수 있습니다. 어쨌든 고마워요 :) –

1

편집에 나열한 UDF를 사용하는 계산 열을 새로 만들 수 있습니다. 이렇게하면 가치가 항상 최신 상태로 유지됩니다.

+0

제안 주셔서 감사. 그러나 나는 반환 국가가 마감일 (매월)에 잠겨 있어야한다는 또 다른 문제가 있습니다. 따라서 closing-date 이후에는 값을 업데이트해서는 안됩니다. 그러나 나는 내가 무엇을해야하는지 안다라고 생각한다. –

+0

그건 그렇고, 누군가가 mdx- 쿼리 (성능상의 이유) 대신 스토어드 프로 시저를 사용하도록 제안했던 근본적인 질문은 이것입니다 : http://stackoverflow.com/questions/3194924/ssas-named-queries –