2017-01-27 10 views
0

그래서 제가 기증자 그룹을 가지고 있고, 그들이 불규칙한 근거로 기부를한다고 가정 해 봅시다. 기부자 이름, 기부 금액 및 기부 날짜를 테이블에 넣을 수는 있지만 그 다음에는 모든 정보에 해당 금액을 포함한 모든 기부 금액을 더한 보고서를 작성하고 싶습니다.이벤트 이후 모든 트랜잭션의 합계를 찾으려면 어떻게합니까?

루프를 사용하여 구문 분석 할 수 있음을 알고 있지만 더 좋은 방법이 있습니까?

나는 기증자가 거래 번호를 할당하고 모든 것이 올바른 순서인지 확인하는 코드로 귀찮게하지 않으므로 여기에서 속임수입니다. 그렇게 쉬운 일입니다.

DECLARE @Donors TABLE (
      ID    INT IDENTITY 
     , Name    NVARCHAR(30) 
     , NID    INT 
     , Amount   DECIMAL(7,2) 
     , DonationDate  DATE 
     , AmountAfter  DECIMAL(7,2) 
     ) 

    INSERT INTO @Donors VALUES 
      ('Adam Zephyr',1,100.00,'2017-01-14',NULL) 
     , ('Adam Zephyr',2,200.00,'2017-01-17',NULL) 
     , ('Adam Zephyr',3,150.00,'2017-01-20',NULL) 
     , ('Braden Yu',1,50.00,'2017-01-11',NULL) 
     , ('Braden Yu',2,75.00,'2017-01-19',NULL) 

    DECLARE @Counter1  INT = 0 
      , @Name   NVARCHAR(30) 

    WHILE @Counter1 < (SELECT MAX(ID) FROM @Donors) 
     BEGIN 
      SET @Counter1 += 1 
      SET @Name = (SELECT Name FROM @Donors WHERE ID = @Counter1) 
      UPDATE d1 
       SET AmountAfter = (SELECT ISNULL(SUM(Amount),0) FROM @Donors d2 WHERE ID > @Counter1 AND Name = @Name) 
        FROM @Donors d1 
         WHERE d1.ID = @Counter1 
     END 

    SELECT * FROM @Donors 

재귀 적으로이 작업을 수행하는 방법이 있어야하지만 내 머리를 감쌀 수 없습니다.

답변

0

이것은 기부자와 그 사람이 기부 한 금액의 합계 인 것으로 추정되는 Name 당 최신 기부를 보여줍니다. 아마도 NID을 파티션에 사용하는 것이 더 적절할 것입니다.

;with MostRecentDonations as (
    select *, 
     row_number() over (partition by Name order by DonationDate desc) as rn, 
     sum(Amount) over (partition by Name) as TotalDonations 
    from @Donors 
) 
select * from MostRecentDonations 
where rn = 1; 

성능 문제가없는 한 어디서나 합계를 저장할 필요가 없습니다.

편집 : 귀하의 질문에 대해 생각해 보았습니다. 이제는 모든 거래가 포함 된 누계를 원한다고 생각합니다. 너무 쉽습니다.

select *, 
    sum(Amount) over (partition by Name order by DonationDate) as DonationsToDate 
from @Donors 
order by Name, DonationDate;