by 윤경호 [SQL Query] 동적 union [2013.07.15 16:07:43]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | WITH TBMG_급여관리(기본급 , 급여항목코드 , 사원번호) AS ( --기본급 , 급여항목코드 , 사원번호 SELECT '100' , '001' , 'A' FROM DUAL UNION ALL SELECT '100' , '002' , 'A' FROM DUAL UNION ALL SELECT '100' , '003' , 'A' FROM DUAL UNION ALL SELECT '200' , '001' , 'B' FROM DUAL UNION ALL SELECT '200' , '002' , 'B' FROM DUAL UNION ALL SELECT '200' , '003' , 'B' FROM DUAL ), TBMG_급여코드(급여항목코드 , 요율) AS ( --급여항목코드 , 요율 SELECT '001' ,0.6 FROM DUAL UNION ALL SELECT '002' ,0.4 FROM DUAL UNION ALL SELECT '003' ,0.1 FROM DUAL ),BMG_직원정보(사원번호,사원명) AS ( --사원번호 SELECT 'A' , '홍길동' FROM DUAL UNION ALL SELECT 'B' , '아무개' FROM DUAL ) SELECT MAX (a.사원명) "사원명" , SUM (b.기본급 * DECODE(c.급여항목코드, '003' ,c.요율*-1,c.요율) ) "기본급" -- 세금은 마이너스인지 DECODE로 연산 , SUM (DECODE(c.급여항목코드, '001' ,b.기본급 * c.요율)) AS 기본급 , SUM (DECODE(c.급여항목코드, '002' ,b.기본급 * c.요율)) AS 수당 , SUM (DECODE(c.급여항목코드, '003' ,b.기본급 * c.요율)) AS 세금 FROM BMG_직원정보 a , TBMG_급여관리 b , TBMG_급여코드 c WHERE a.사원번호 = b.사원번호 AND b.급여항목코드 = c.급여항목코드 GROUP BY a.사원번호 ORDER BY a.사원번호 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | -- Row 는 데이터 량에 따라 가변적으로 늘어나지만 -- Column 은 고정입니다. 가변적으로 늘리려면 동적으로 구현해야 합니다. -- 조인관계만 명확하게 정의 한다면 테이블을 여러번 읽을 필요는 없습니다. -- 5,6,7번항목이 1번 항목에 요율을 곱하는 걸로 해서 작성했습니다. -- 더 다양한 case 가 있다면 조인절의 Case 절을 손보셔야 할듯. SELECT a.팀코드, a.사원번호 , SUM (DECODE(c.급여항목코드, '001' , b.지급금액)) AS 기본급 , SUM (DECODE(c.급여항목코드, '002' , b.지급금액)) AS 상여 , SUM (DECODE(c.급여항목코드, '003' , b.지급금액)) AS 식대 , SUM (DECODE(c.급여항목코드, '004' , b.지급금액)) AS 자가운전 , SUM (DECODE(c.급여항목코드, '005' , b.지급금액 * c.요율)) AS 국민연금 , SUM (DECODE(c.급여항목코드, '006' , b.지급금액 * c.요율)) AS 건강보험 , SUM (DECODE(c.급여항목코드, '007' , b.지급금액 * c.요율)) AS 고용보험 FROM TBMG_직원정보 a , TBMG_급여관리 b , TBMG_급여코드 c WHERE b.귀속년월 = #귀속년월# AND a.기관코드 = #기관코드# AND b.기관코드 = #기관코드# AND c.기관코드 = #기관코드# AND a.사원번호 = b.사원번호 AND b.급여항목코드 = CASE WHEN c.급여항목코드 IN ( '005' , '006' , '007' ) THEN '001' ELSE c.급여항목코드 END GROUP BY a.팀코드, a.사원번호 ORDER BY a.팀코드, a.사원번호 ; |
안녕하세요
sum(decode를 이용해서 PIVOT을 했는데요
PIVOT없이 c.급여항목코드 전체와 급여공제가 '02'인 급여항목에 요율을 곱하여 계산된 지급금액이 나올려면 어떻게 해야 하나요?
시도를 해봤는데 급여항목코드 전체가 나오지 않아서 답답합니다.
도움주시면 감사하겠습니다.
SELECT a.사원번호
, c.급여항목코드명
, c.급여항목코드
, case when b.급여항목코드 = '001' then b.지급금액 * c.요율
else b.지급금액
end
, c.요율
FROM TBMG_직원정보 a
, TBMG_급여관리 b
, TBMG_급여코드 c
WHERE b.귀속년월 = '201307'
AND a.기관코드 = '4028220135'
AND b.기관코드 = '4028220135'
AND c.기관코드 = '4028220135'
AND a.사원번호 = b.사원번호
AND b.급여항목코드 = decode(c.급여공제구분, '02','001' , c.급여항목코드)
GROUP BY a.팀코드, a.사원번호, c.급여항목코드명, c.급여항목코드,b.급여공제구분, b.지급금액, c.요율, b.급여항목코드
ORDER BY a.팀코드, a.사원번호, c.급여항목코드
1 2 3 4 5 6 7 8 9 10 11 12 13 | -- 위와 같이 아우터 조인을 두개 테이블과 할 수는 없겠네요... -- 아래와 같이 ANSI 조인을 써야 하겠네요. SELECT * FROM TBMG_급여코드 c INNER JOIN TBMG_직원정보 a ON a.기관코드 = c.기관코드 LEFT OUTER JOIN TBMG_급여관리 b ON c.기관코드 = b.기관코드 AND a.사원번호 = b.사원번호 AND b.급여항목코드 = DECODE(c.급여공제구분, '02' , '001' , c.급여항목코드) AND b.귀속년월 = '201307' WHERE c.기관코드 = '4028220135' ; |