본문 바로가기

프로그램 경험/Database

[SqlServer] 월별 누계 금액 구하기

월별 누계 금액 구하기 - SqlServer

금액과 관련해서 조회 할때 꼭 나오는 누계 금액 구하기 입니다. 여기서는 기부금이 매달 입금되는 테이블을 예로 들어서 설명 해보겠습니다.
기부받는곳에 매달 얼마의 금액에 입금되고 누계된 금액은 얼마인지를 알고 싶을때 조회 하는 쿼리 입니다.

예를 들어 달동네에 2014년 1월엔 2만원, 2014년 2월엔 5만원이 입금되었을때 아래와 같이 보고 싶은것 입니다.


기부처 년월 기부금 누계 기부금
달동네 2014/1 2만원 2만원
달동네 2014/2 5만원 7만원
--임시 테이블을 생성
DECLARE @Temp TABLE 
(
 Field                VARCHAR(10)        --기부받는곳
 ,InputYYMM            VARCHAR(6)           --입금년월
 ,Amount            INT                --입금액
);

--데이터를 월단위로 입력한다.
INSERT INTO @Temp VALUES('달동네','201401', 20000);
INSERT INTO @Temp VALUES('달동네','201402', 50000);
INSERT INTO @Temp VALUES('달동네','201403', 40000);
INSERT INTO @Temp VALUES('달동네','201404', 50000);
INSERT INTO @Temp VALUES('달동네','201405', 40000);

--한번 조회좀 해보고
SELECT 
*
FROM @Temp;

--자기 자신을 조인해서 데이터를 뻥튀기 시킵니다.
--그리고 그룹화 시키면서 월별 비교해서 합계를 구합니다.
SELECT 
    A.Field
  , A.InputYYMM
  , A.Amount       --금액
  , SUM(CASE WHEN B.InputYYMM <= A.InputYYMM THEN B.Amount END) AS SumAmount       --누계금액
FROM @Temp AS A
    INNER JOIN @Temp AS B
        ON A.Field = B.Field
GROUP BY 
    A.Field, A.InputYYMM, A.Amount


--똑같은 결과지만 비교절을 옮긴것 입니다.
SELECT 
    A.Field
  , A.InputYYMM
  , A.Amount      --금액
  , SUM(B.Amount) AS SumAmount   --누계금액
FROM @Temp AS A
    INNER JOIN @Temp AS B
        ON A.Field = B.Field
        AND B.InputYYMM <= A.InputYYMM
GROUP BY 
    A.Field, A.InputYYMM, A.Amount