2017-07-11 11 views
0

ランニングバランスに関する助けが必要です。私はすでに終わりのバランスを取っています。しかし、私はまた、最初のバランスを作りたい。私の残高は "386240.00"です。私のスクリーンショットでは、「実行」列は終了時の残高です。どちらが正しいのか、そして「プリンシパル」から行ごとに差し引かれます。しかし、私は最初のバランス "bal_run"列を試しているとき、計算は "プリンシパル"からのベースにする必要があります。 "bal_run"の最初の行は正しいですが、2行目は "プリンシパル"の1行目より少なくなります。TSQLを使用してランニングバランスを計算する

私はあなたがこのような合計のためにウィンドウを使用する必要があるかもしれませんSQL Serverの2014

enter image description here

CREATE PROC spAppPaymentSchedRB @RENum as varchar(150), @Amount as decimal(19, 6) 
AS 

--SET @Amount = @Amount - (-664250.000000 * -1.00) 

DECLARE @TotalAmount as money, @ItemCode as varchar(50), @BegBal as money 

SELECT @ItemCode = U_App_ItemCode FROM [@APP_OAMS] WHERE U_App_DocNum = @RENum 
SELECT @BegBal = U_APPRE_Begbal FROM OITM WHERE ItemCode = @ItemCode 

IF @BegBal > 0.00 
    BEGIN 
     SELECT @Amount = @BegBal 
    END 

;WITH schedRB as 
(
SELECT 
    U_App_RBTerm 'Term' 
    , a.U_App_DocNum 'Trans No.' 
    , IsNULL(CASE WHEN b.U_App_InvNo = 0 THEN '' ELSE b.U_App_InvNo END, '') 'Inv#' 
    , IsNULL(CASE WHEN b.U_App_PaymentNum = 0 THEN '' ELSE b.U_App_PaymentNum END, '') 'Payment#' 
    , U_App_RBDesc 'Description' 
    , U_App_RBDate 'Date' 
    , IsNULL(B2.SumApplied, U_APP_RBayment) 'Payment' /*BTG 3/16/2017 - Include total amount paid*/ 
    , U_APP_RBInterest 'Interest' 
    , U_APP_RBPrincipal 'Principal' 
    , U_APP_RBPRB 'Principal Running Bal.' 
    , U_APP_RBRRB 'Receivable Running Bal.' 
    , U_APP_PrincipalBal 'Principal_Balance' 
    , a.U_APP_UserSign 
    , a.Code 
    , a.U_App_LineNum 
    , a.U_App_VisOrder 
     FROM [@APP_TRBS] a 
      LEFT JOIN [@APP_AMS3](NOLOCK) b ON a.U_App_DocNum = b.U_App_DocNum AND a.U_App_VisOrder = b.U_App_VisOrder /*BTG 2/27/2017 - Old a.U_App_LineNum = b.U_App_LineNum */ 
      /*BTG 3/16/2017 - Include total amount paid*/ 
      LEFT JOIN ORCT B1 on b.U_App_PaymentNum = B1.DocNum 
      LEFT JOIN RCT2 B2 on B1.Docnum = b2.DocNum AND b.U_App_InvNo = b2.DocEntry /*BTG 2/27/2017 - added B.U_App_InvNo = b2.DocEntry for Filtering*/  
     WHERE (a.U_App_LineStatus <> 'Y' OR a.U_App_LineStatus IS NULL) AND a.U_App_DocNum = @RENum 

UNION ALL 

SELECT 
    b.U_App_RBTerm 'Term' 
    , a.U_App_DocNum 
    , '' 'Inv#' 
    , U_App_PaymentNum 'Payment#' 
    , '' 'Description' 
    , U_App_PCheckDate 'Date' 
    , U_App_PAmount 'Payment' 
    , 0.00 'Interest' 
    , 0.00 'Principal' 
    , 0.00 'Principal Running Bal.' 
    , 0.00 'Receivable Running Bal.' 
    , 0.00 'Principal_Balance' 
    , '' 'U_App_UserSign' 
    , '' 'Code' 
    , a.U_App_LineNum  
    , b.U_App_VisOrder 
     FROM [@APP_BMS3] a 
     INNER JOIN [@APP_TRBS] b ON a.U_App_DocNum = b.U_App_DocNum AND a.U_App_LineNum = b.U_App_LineNum AND a.U_App_DocNum = @RENum 
) 

    SELECT 
     Term 
     , [Trans No.] 
     , [Inv#] 
     , [Payment#] 
     , Description 
     , Date 
     , Payment 
     , Interest 
     , Principal 
     , CASE WHEN @Amount - sum(Principal) over (order by CAST(U_App_VisOrder as decimal(19, 2)) /*Date*/) < -100.00 THEN 0.00 ELSE @Amount - sum(Principal) over (order by CAST(U_App_VisOrder as decimal(19, 2)) /*Date*/) END as 'Principal Running Bal.' 
     , [Receivable Running Bal.] 
     , U_APP_UserSign 
     , Code 
     , U_App_LineNum 
     , U_App_VisOrder 
     , @Amount - CASE WHEN Description = 'Installment 1' THEN 0.00 ELSE sum(Principal_Balance) over (order by CAST(U_App_VisOrder as decimal(19, 2))/*Date*/) END 'bal_run' 
     , @Amount - sum(Principal) over (order by CAST(U_App_VisOrder as decimal(19, 2)) /*Date*/) 'run' 
     INTO #TEMP 
     FROM schedRB --WHERE U_App_LineNum <> 0 

     SELECT *, (SELECT TOP 1 run FROM #TEMP ORDER BY CAST(U_App_VisOrder as decimal(19, 2)) DESC) 'run2' FROM #TEMP 
      ORDER BY CAST(U_App_VisOrder as DECIMAL(19, 4)) 
     DROP TABLE #TEMP 
; 

GO 

/*How to use*/ 
EXEC spAppPaymentSchedRB '685', 386240.00 
+0

使用しているどのようなデータベース? –

+0

私はSQL Server 2014を使用しています。 –

+0

これをチェックしてください:[ベストプラクティスの実行方法](https://sqlperformance.com/2012/07/t-sql-queries/running-totals) –

答えて

0

を使用しています:

@Amount - CASE WHEN Description = 'Installment 1' THEN 0.00 ELSE sum(Principal_Balance) over (order by CAST(U_App_VisOrder as decimal(19, 2)) 
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING/*Date*/) END 'bal_run' 
関連する問題