같은 테이블에서 전월의 값을 읽어서 보여줘야 할때... 0 3 2,323

by 꾼이되자 [2009.06.30 07:27:32]


안녕하세요?

오랫만에 글을 남기는거 같습니다.

저는 회계업무쪽을 하고 있는데요...

지금이 6월달이면 5월의 누계금액 즉, 전월이월값을 구하고자 합니다.

지금은 6월달이면 조건을 ’2009-06’해서 가져오고 위에서 union all로 또 같은 테이블의 전월누계값을 가지고 옵니다...

예를 들면 아래와 같습니다 *^^*

SELECT  ’전월이월’  DESC,

                 SUM(차변_AMOUNT)  차변_AMT,

                 SUM(대변_AMOUNT)  대변_AMT

FROM      ACCOUNTS

WHERE  DATE = ’2009-05’

UNION ALL

SELECT  DESC,

                 차변_AMT,

                 대변_AMT

FROM      ACCOUNTS

WHERE  DATE = ’2009-06’

 

실제 쿼리는 좀더 복잡하지만 여기선 쉽게 적어보았습니다.

암튼 제 생각은 같은 테이블을 한번만 읽고 가능할수 없나 해서요...

원하는 결과값은 이렇습니다...

 

  차변 대변
전월이월 1,000,000 500,000
수수료 500  
6월 월급 400,000  
이자수익   6,000
월잔액 400,500 6,000
총합계 1,400,500 506,000

월잔액/총합계까지 쿼리로 구할수 있다면 더욱 좋구요 ^^;

그럼~ 오늘도 고수님들 수고하십시요 *^^*

by 서성우 [2009.06.30 10:59:29]
WITH test AS
(
SELECT '200905' des , 1000 cha , 1000 dae FROM dual
UNION ALL SELECT '200905' , 5000 , 5000 FROM dual
UNION ALL SELECT '200906' , 1000 , 1000 FROM dual
UNION ALL SELECT '200906' , 2000 , 2000 FROM dual
UNION ALL SELECT '200906' , 3000 , 3000 FROM dual
)
SELECT Decode(des,'200905',Decode(a||b,00,'전월이월',des),'200906',Decode(a||b,01,'월잔액',des),NULL,'총합계',des) des
,cha
,dae
FROM
(SELECT des
,Sum(cha) cha
,Sum(dae) dae
,Row_Number() over(PARTITION BY des ORDER BY des) num
,Grouping(des) a
,Grouping(grp) b
FROM
(SELECT des
,cha
,dae
,CASE WHEN des < '200906' THEN 1
ELSE
Row_Number() over(PARTITION BY des ORDER BY des)
END grp
FROM test
WHERE des BETWEEN '200905' AND '200906')
GROUP BY rollup(des,grp))
WHERE num = Decode(des,'200905',1,num)


by 김강환 [2009.06.30 10:59:57]
테이블 구조가 정확히 어떻게 되어 있는지 몰라서 자세히는 모르겠지만 아래처럼 하면 되겠네요

DES:계정항목
GUBUN:차대변 구분
AMT:금액
WDATE:전표발생일자

WITH TEMP AS(
SELECT 'AAA' DES,'C' GUBUN,500 AMT,'20060501' WDATE FROM DUAL UNION ALL
SELECT 'BBB' DES,'D' GUBUN,1500 AMT,'20060502' WDATE FROM DUAL UNION ALL
SELECT 'CCC' DES,'C' GUBUN,1500 AMT,'20060503' WDATE FROM DUAL UNION ALL
SELECT 'DDD' DES,'D' GUBUN,2500 AMT,'20060511' WDATE FROM DUAL UNION ALL
SELECT 'EEE' DES,'C' GUBUN,500 AMT,'20060531' WDATE FROM DUAL UNION ALL
SELECT 'AAA' DES,'C' GUBUN,500 AMT,'20060601' WDATE FROM DUAL UNION ALL
SELECT 'BBB' DES,'D' GUBUN,2500 AMT,'20060605' WDATE FROM DUAL UNION ALL
SELECT 'CCC' DES,'C' GUBUN,1500 AMT,'20060611' WDATE FROM DUAL UNION ALL
SELECT 'DDD' DES,'D' GUBUN,2500 AMT,'20060621' WDATE FROM DUAL UNION ALL
SELECT 'EEE' DES,'C' GUBUN,500 AMT,'20060625' WDATE FROM DUAL
)
SELECT DECODE(GROUPING(WDATE)+GROUPING(DES),2,'총합계',1,'월잔액',DES)DES
,SUM(DEBIT) DEBIT
,SUM(CREDIT) CREDIT
FROM
(
SELECT SUBSTR(WDATE,1,6) WDATE
,DECODE(SUBSTR(WDATE,1,6),'200605','전월이월',DES) DES
,DECODE(GUBUN,'D',AMT) DEBIT
,DECODE(GUBUN,'C',AMT) CREDIT
FROM TEMP
WHERE WDATE BETWEEN '20060501' AND '20060630'
)
GROUP BY ROLLUP(WDATE,DES)
HAVING NOT (GROUPING(DES)||WDATE='1200605')

by 꾼이되자 [2009.07.01 07:03:38]
서성우님, 김강환님 답변 모두 감사합니다.
응용해서 잘 써보겠습니다.
그런데요 김강환님~ grouping이란 함수 여기 사이트에서 찾아봐서 읽었는데도 이해가 잘 안가요...ㅠㅠ
이해력이 좀 떨어지나 봅니다...
암튼 잘 찾아서 잘 알아서 해보겠습니다.
감사합니다 *^^*
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입