0

所以这是为了SSRS报告,所以我使用临时表。我有两张表,一张用于交易,我只是用它来拉帐户和金额。第二个是我试图根据事务进行调整的已摊销的拖欠信息,但我遇到了语法问题。 case语句不允许与游标或更新一起使用吗?基于嵌套光标的更新

--Example Transaction:Account 123456 Principal 500.00 Interest 250.00 

delinquent 5 months of 200 principal each month, the transaction had principal amount of 500, the first two are left alone, the third is reduced to 100 to match the total to the transaction amount, leaving a remaining amount of 0 

--Delinquent data 
-- 11/2015 Prin 200 Int 80 -> Prin 0 Int 0 (running total Prin 500 Int 250) 
-- 10/2015 Prin 200 Int 80 -> Prin 0 Int 10 (running total Prin 500 Int 250) 
-- 9/2015 Prin 200 Int 80 -> Prin 100 Int 80 (running total Prin 500 Int 240) 
-- 8/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 400 Int 160) 
-- 7/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 200 Int 80) <- process starts from the oldest and goes up. 

这需要使用游标,因为我不能在一组过程,因为它已经开始与最古老的排,调整,找到剩下的总量,再进行调整下一行。如果达到交易金额,剩余的行将被清零。然后,我将剩余的金额返回到交易表。

Declare TranCursor Cursor FORWARD_ONLY 
For Select LoanNumber, PrincipalCollected, InterestCollected, ServiceFee, PayoffPrincipal,PayoffInterest,PayoffServiceFee 
From #transFinal 
FOR UPDATE OF PayoffPrincipal,PayoffInterest,PayoffServiceFee 


Open TranCursor; 
Fetch next from TranCursor into @TranLoan, @TranPrin, @TranInt, @TranServ, @POPrin,@POInt,@POServ 
while (@@Fetch_status = 0) 
Begin 
    --Process this individual loan's transaction by going through each set of amortized amounts starting with the oldest and reducing excess of transaction amounts to zero. 
    --eg. delinquent 3 months of 200 principal each month, the transaction had principal amount of 500, the first two are left alone, the third is reduced to 100 to match the total to the transaction amount 
    --Transaction Principal 500 Interest 250 
    --Delinquent data 
    -- 11/2015 Prin 200 Int 80 -> Prin 0 Int 0 (running total Prin 500 Int 250) 
    -- 10/2015 Prin 200 Int 80 -> Prin 0 Int 10 (running total Prin 500 Int 250) 
    -- 9/2015 Prin 200 Int 80 -> Prin 100 Int 80 (running total Prin 500 Int 240) 
    -- 8/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 400 Int 160) 
    -- 7/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 200 Int 80) <- process starts from the oldest and goes up. 
    Declare DelqCursor CURSOR FORWARD_ONLY 
    FOR select LoanNumber,DelqPrin ,DelqInt ,DelqServFee from #dq 
     where LoanNumber = @TranLoan 
     Order by PaidToDate Asc 
     For update OF DelqPrin, DelqInt, DelqServFee; 
     Open DelqCursor; 
----------------------------------------------------------------------------------------------------------- 
-- Processing individual row of delinquent data 
----------------------------------------------------------------------------------------------------------- 
Fetch next from DelqCursor into @DelqPrin, @DelqInt, @DelqServ, @DelqPTD --, @POPrin,@POInt,@POServ 
while (@@Fetch_status = 0) 
    BEGIN 


      CASE when @TranPrin = 0 then set @DelqPrin = 0 -- Syntax error on case 
       WHEN @TranPrin >0 and @TranPrin > @DelqPrin then -- Syntax error on when 
        set @TranPrin = @TranPrin - @DelqPrin 
        set @ColPrin = @ColPrin + @DelqPrin 
       WHEN @TranPrin >0 and @TranPrin < @DelqPrin then 
        set @ColPrin = @ColPrin + @TranPrin 
        set @TranPrin = 0 
        set @DelqPrin = @DelqPrin [email protected] 
      end 

      CASE when @TranInt = 0 then set @DelqInt = 0 
       WHEN @TranInt >0 and @TranInt > @DelqInt then 
        set @TranInt = @TranInt - @DelqInt 
        set @ColInt = ColInt + @DelqInt 
       WHEN @TranInt >0 and @TranInt < @DelqInt then 
        set @ColInt = @ColInt + @TranInt 
        set @TranInt = 0 
        set @DelqInt = @DelqInt [email protected] 
      end 

      CASE when @TranServ = 0 then set @DelqServFee = 0 
       WHEN @TranServ >0 and @TranServ> @DelqServ then 
        set @TranServ = @TranServ - @DelqServ 
        set @ColServ = ColServ + @DelqServ 
       WHEN @TranServ >0 and @TranServ < @DelqServ then 
        set @ColServ = @ColServ + @TranServ 
        set @TranServ = 0 
        set @DelqServ = @DelqServ [email protected] 
      end 

Fetch next from DelqCursor into @DelqPrin, @DelqInt, @DelqServ, @DelqPTD 
End 
----------------------------------------------------------------------------------- 
--All rows of delinquent data for a single loan have been processed. Now we update the Payoff columns 
---------------------------------------------------------------------------------- 
Set @PoPrin = @ColPrin 
Set @PoInt = @ColInt 
Set @PoServ = @ColServ 
--Todo Finish update statement for outside loop to update transaction table 
Close DelqCursor-- Finished with delinquent data for this loan. We close the cursor 
Fetch next from TranCursor into @TranLoan, @TranPrin, @TranInt, @TranServ, @POPrin,@POInt,@POServ --Start Processing next loan 
End 

Close TranCursor 
deallocate DelqCursor 
deallocate TranCursor 

我很感激任何见解,我可以弄清楚为什么我的情况下,当声明给我的错误。我在msdn语法中没有看到任何可以防止逻辑运行的案例。

回答

1

您编写CASE语句的方式不起作用。案例逻辑需要在SELECTSET内发生。你的只是那里,和SET是在中间,后THEN

您需要将您的逻辑代码更改为您的代码中每个CASE

IF @TranPrin = 0 
    SET @DelqPrin = 0 

IF @TranPrin >0 AND @TranPrin > @DelqPrin 
BEGIN 
    SET @TranPrin = @TranPrin - @DelqPrin 
    SET @ColPrin = @ColPrin + @DelqPrin 
END 

IF @TranPrin > 0 AND @TranPrin < @DelqPrin 
BEGIN 
    SET @ColPrin = @ColPrin + @TranPrin 
    SET @TranPrin = 0 
    SET @DelqPrin = @DelqPrin [email protected] 
END 

CASE (Transact SQL) Reference

+0

不知道我怎么错过了事实,这是不是在选择或设置。谢谢。 – xenapan