2

나는 "환자 원장 리포트"라고 불리는 저장 프로 시저를 가지고 있습니다. 여기서 환자의 일일 거래 세부 사항 및 잔액을 표시해야합니다 .i는 아래 코드에서 샘플링 한 데이터를 제공하고 있습니다. 데이터가 내 sp에 내 임시 테이블에 삽입되었습니다.원장 리포트 로직 저장 프로 시저

create table #Patient_ledger (PATIENT_NAME varchar(250),PATIENT_NBR bigint,BILLNO varchar(250),BILLAMOUNT bigint, 
PAID_AMOUNT bigint) 

Insert into #Patient_ledger (Patient_name ,Patient_nbr ,billno ,billamount , 
paid_amount) 

select 'ABC',1,'DUE_BILL_ABC_1',100,50 
union all 
select 'ABC',1,'DUE_BILL_ABC_2',160,90 
UNION ALL 
select 'ABC',1,'DEPOSIT_BILL_ABC',0,60 
UNION ALL 
select 'XYZ',2,'DEPOSIT_BILL_XYZ',0,70 
UNION ALL 
select 'XYZ',2,'DUE_BILL_XYZ_1',100,30 

SELECT * FROM #Patient_ledger 

Drop table #Patient_ledger 

내 보고서에 데이터를 표시하고 싶습니다.

PATIENT_NUMBER BILLNO   BILLAMOUNT PAID_AMOUNT BALANCE 

    1   DUE_BILL_ABC_1  100   50   50 --(100-50)  
    1   DUE_BILL_ABC_2  160   90   120 --(160-90 +50(Here 50 is prev balance amount of same patient)) 
    1   DEPOSIT_BILL_ABC  0   40   80 ---(120-40=80) 
    2   DEPOSIT_BILL_XYZ  0   70   0   
    2   DUE_BILL_XYZ_1  100   30   0 --Here Balance is zero because patient has deposited some  
                   --amount before bill (70-100+30=0)  

Note: Balance amount should deduct when deposits are paid by that particual patient. 
+1

왜 네 번째 행의 균형이 0입니까? 80-70 = 10 – KumarHarsh

+1

이 레코드 또는 ID를 주문할 날짜가 있습니까? – Tanner

+0

@KumarHarsh 가능성이 다른 환자 때문입니까? – Tanner

답변

1

난 당신이 판별도 넣을 수 주문할 경우 그것은 당신에게

SELECT Patient_nbr, 
     billno, 
     billamount, 
     PAID_AMOUNT, 
     CASE 
     WHEN RNO > 1 THEN Sum(billamount - PAID_AMOUNT) 
          OVER(
           PARTITION BY Patient_nbr 
           ORDER BY RNO) 
     ELSE Iif((billamount - PAID_AMOUNT) < 0, 0, billamount - PAID_AMOUNT) 
     END 
FROM (SELECT *, 
       Row_number() 
       OVER(
        PARTITION BY Patient_nbr 
        ORDER BY Patient_nbr) AS RNO 
     FROM #Patient_ledger) A 
1

도움이 될 수 있습니다 아래와 같이 시도, 수이 보인다 : (나는 또한 더있을 수 있다는 사실을 고려 PATIENT_NBR 한 명을위한 기한/기탁금)

IF OBJECT_ID('tempdb..#Patient_ledger') IS NOT NULL DROP TABLE #Patient_ledger 
    CREATE TABLE #Patient_ledger 
    (ID INT IDENTITY, 
    PATIENT_NAME varchar(250), 
    PATIENT_NBR bigint, 
    BILLNO varchar(250), 
    BILLAMOUNT bigint, 
    PAID_AMOUNT bigint) 

Insert into #Patient_ledger (PATIENT_NAME ,PATIENT_NBR ,BILLNO ,BILLAMOUNT , 
PAID_AMOUNT) 

select 'ABC',1,'DUE_BILL_ABC_1',100,50 
union all 
select 'ABC',1,'DUE_BILL_ABC_2',160,90 
UNION ALL 
select 'ABC',1,'DEPOSIT_BILL_ABC',0,40 
UNION ALL 
select 'XYZ',2,'DEPOSIT_BILL_XYZ',0,70 
UNION ALL 
select 'XYZ',2,'DUE_BILL_XYZ_1',100,30 


;WITH CTE AS (
SELECT PATIENT_NBR, 
     BILLNO, 
     PAID_AMOUNT, 
     BILLAMOUNT, 
     BILLAMOUNT-PAID_AMOUNT AS BALANCE, 
     ROW_NUMBER() OVER (PARTITION BY PATIENT_NBR ORDER BY ID) AS RN 
FROM #Patient_ledger) 

SELECT a.PATIENT_NBR, 
     a.BILLNO, 
     a.BILLAMOUNT, 
     a.PAID_AMOUNT, 
     CASE WHEN ISNULL(LAG(a.BALANCE + ISNULL(x.ADDS,0)) OVER (PARTITION BY a.PATIENT_NBR ORDER BY a.RN),0) + a.BILLAMOUNT - a.PAID_AMOUNT < 0 
      THEN 0 
      ELSE a.BALANCE + ISNULL(x.ADDS,0) 
     END AS FINAL_BALANCE 

FROM CTE a 
CROSS APPLY (SELECT SUM(BALANCE) AS ADDS 
       FROM CTE f 
        WHERE f.PATIENT_NBR = a.PATIENT_NBR AND f.RN < a.RN) x 
+0

지연 기능을 사용하지 않고 논리를 원합니다. 클라이언트 서버가 2008 년이기 때문에 2008. –

1

다른 샘플 데이터와도 호환되는지 확인해보십시오.

create table #Patient_ledger (PATIENT_NAME varchar(250),PATIENT_NBR bigint 
,BILLNO varchar(250),BILLAMOUNT bigint,PAID_AMOUNT bigint) 

Insert into #Patient_ledger (Patient_name ,Patient_nbr ,billno 
,billamount ,paid_amount) 

select 'ABC',1,'DUE_BILL_ABC_1',100,50 
union all 
select 'ABC',1,'DUE_BILL_ABC_2',160,90 
UNION ALL 
select 'ABC',1,'DEPOSIT_BILL_ABC',0,40 
UNION ALL 
select 'XYZ',2,'DEPOSIT_BILL_XYZ',0,70 
UNION ALL 
select 'XYZ',2,'DUE_BILL_XYZ_1',100,30 


SELECT PATIENT_NBR PATIENT_NUMBER 
    ,BILLNO 
    ,BILLAMOUNT 
    ,PAID_AMOUNT 
    ,CASE 
     WHEN billamount = 0 
      AND lag((BILLAMOUNT - PAID_AMOUNT), 1, 0) OVER (
       PARTITION BY PATIENT_NBR ORDER BY PATIENT_NBR 
       ) = 0 
      THEN 0 
     ELSE SUM((BILLAMOUNT - PAID_AMOUNT)) OVER (
       PARTITION BY PATIENT_NBR ORDER BY PATIENT_NBR ROWS UNBOUNDED PRECEDING 
       ) 
     END Balance 
FROM #Patient_ledger 

Drop table #Patient_ledger 
+0

지연 기능을 사용하지 않고 논리를 원합니다. 클라이언트 서버가 2008이기 때문에. –