by 윤경호 [SQL Query] 동적 union [2013.07.15 16:07:43]
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.사원번호
-- 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.급여항목코드
-- 위와 같이 아우터 조인을 두개 테이블과 할 수는 없겠네요... -- 아래와 같이 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' ;