날짜 |
금액 |
구분 |
20180701 |
1000 |
입금 |
20180705 |
2000 |
입금 |
20180726 |
2000 |
출금 |
20180801 |
4000 |
입금 |
20180811 |
8000 |
출금 |
20180815 |
6500 |
출금 |
20180830 |
9000 |
입금 |
20180906 |
8000 |
출금 |
20180917 |
1000 |
입금 |
날짜,
금액, 구분 컬럼을 가진 금액 현황 테이블이 있고
구분 |
~7월 |
8월 |
9월 |
10월 |
기초금액 |
60000 |
60000 |
58500 |
51500 |
입금 |
3000 |
13000 |
1000 |
0 |
출금 |
3000 |
14500 |
8000 |
0 |
잔액 |
60000 |
58500 |
51500 |
51500 |
이렇게 출력할려고 합니다.
해당 월(현재는 8월로 가정) 기준으로 전월(~7월)은 1월~ 전전월(6월)까지의 기초금액(sum(입금액 - 출금액))을 구하고
월에 해당하는 입금액 합계와 출금액 합계를 구한 뒤 기초금액 + 입금액 - 출금액을 하여 잔액을 구합니다.
그리고 다음달은 그 전달의 잔액을 기초금액으로 표시하고 나머지 입금, 출금, 잔액은 똑같은 방식으로 구합니다.
해당 월 기준으로 차차월까지 구합니다.
기초잔액과 잔액 구하는 쿼리를 어떤 식으로 작성해야 될지 모르겠습니다.
도움을 주시면 감사하겠습니다.
Comment 2
-
건우아빠
2019.01.16 23:05
2008 이하버전에서만 작업하다보니 원시적인 방법밖에는 원리만 응용하시면
2012이상 버전에서는 누적 함수등이 지원 하는걸로 아는데 ....이건 다른 고수님께서....
먼저 기초와 잔액을 컬럼으로 만드시는 쿼리를 짜야 합니다.
누적 쿼리를 로 짜시고 월의 시작(1) 인 경우 누적- 계산금액 = 기초 , 월의 마지막(1) 누적값 = 잔액
이렇게 값을 만드시고 월별 집계를 하시면 월별 ,기초금액 ,입금금액 , 출금금액, 잔액 이 만들어 집니다..
이걸 PIVOT으로 걸면 원하시는 결과를 만드실수 있습니다.
단계별로 쿼리를 실행 해 보시면 원리를 아실듯 합니다.
WITH
RES1 AS
(
SELECT '20180101' [날짜],1000 [금액] , '입금' [구분] union ALL
SELECT '20180105' [날짜],2000 [금액] , '입금' [구분] union ALL
SELECT '20180126' [날짜],2000 [금액] , '출금' [구분] union ALL
SELECT '20180201' [날짜],4000 [금액] , '입금' [구분] union ALL
SELECT '20180326' [날짜],2000 [금액] , '출금' [구분] union ALL
SELECT '20180301' [날짜],4000 [금액] , '입금' [구분] union ALL
SELECT '20180426' [날짜],2000 [금액] , '출금' [구분] union ALL
SELECT '20180501' [날짜],4000 [금액] , '입금' [구분] union ALL
SELECT '20180526' [날짜],2000 [금액] , '출금' [구분] union ALL
SELECT '20180601' [날짜],4000 [금액] , '입금' [구분] union ALL
SELECT '20180701' [날짜],1000 [금액] , '입금' [구분] union ALL
SELECT '20180705' [날짜],2000 [금액] , '입금' [구분] union ALL
SELECT '20180726' [날짜],2000 [금액] , '출금' [구분] union ALL
SELECT '20180801' [날짜],4000 [금액] , '입금' [구분] union ALL
SELECT '20180811' [날짜],8000 [금액] , '출금' [구분] union ALL
SELECT '20180815' [날짜],6500 [금액] , '출금' [구분] union ALL
SELECT '20180830' [날짜],9000 [금액] , '입금' [구분] union ALL
SELECT '20180906' [날짜],8000 [금액] , '출금' [구분] union ALL
SELECT '20180917' [날짜],1000 [금액] , '입금' [구분] ) ,
RES2 AS
(
SELECT *
, LEFT([날짜],6) YYYYMM
, ROW_NUMBER() OVER(ORDER BY [날짜], [구분]) NO
, (CASE WHEN [구분]= '입금' THEN 1 ELSE -1 END ) * [금액] [계산금액]
FROM RES1
) ,
RES3 AS(
SELECT A.