구분별 SELECT 해오는 방법에 대한 질문 입니다.. 0 4 1,574

by DONKEY [SQL Query] [2016.08.29 10:57:47]


캡처.PNG (38,734Bytes)


 

안녕하세요! 질문좀 드릴려고 글 올렸습니다!
결과셋은 아래와 같으며 제가 원하는것은
MOD(ROW_NUMBER() OVER(PARTITION BY PAY_DEDU_FLAG ORDER BY PAY_ITEM_CD),2) 이 값이 0일땐 좌측, 1일땐 우측에 출력되어
총 72로우로 출력되는 데이터를 널값 없이 36로우로 출력되는 데이터로 뽑고 싶습니다!..
피벗 개념으로 접근해야되는건지 아니면 처음부터 접근이 잘못된건지 잘모르겠습니다.. 현재는 아래와 같이
진행 하였습니다.. 해결책이 있을까요?

SELECT DECODE(IT.RN,0,IT.PRNT_NM) AS PRNT_NM_1
     , SUM(DECODE(IT.RN,0,NVL(IP.PAY_ITEM_AMT,0))) AS PAY_ITEM_AMT_1
     , DECODE(IT.RN,0,CASE WHEN IT.PAY_DEDU_FLAG IN ('1','3') THEN '1' ELSE '2' END) AS PAY_DEDU_FLAG_1
     , DECODE(IT.RN,1,IT.PRNT_NM) AS PRNT_NM_2
     , SUM(DECODE(IT.RN,1,NVL(IP.PAY_ITEM_AMT,0))) AS PAY_ITEM_AMT_2
     , DECODE(IT.RN,1,CASE WHEN IT.PAY_DEDU_FLAG IN ('1','3') THEN '1' ELSE '2' END) AS PAY_DEDU_FLAG_2
     , IT.RN
  FROM MPP_MMPAYMST MM
 INNER JOIN MPB_PAYPRFITM PR    ON MM.PAY_CLS_PRFSHIP_FLAG = PR.PAY_CLS_PRFSHIP_FLAG
  LEFT OUTER JOIN MPP_PAYITEMPYDTL IP ON MM.EMP_NO = IP.EMP_NO AND MM.PY_YM = IP.PY_YM AND MM.PAY_PY_FLAG = IP.PAY_PY_FLAG AND PR.PAY_ITEM_CD = IP.PAY_ITEM_CD
  LEFT OUTER JOIN (SELECT PAY_ITEM_CD,PAY_DEDU_FLAG,PRNT_NM,MOD(ROW_NUMBER() OVER(PARTITION BY PAY_DEDU_FLAG ORDER BY PAY_ITEM_CD),2) RN FROM MPB_PAYITEM) IT ON PR.PAY_ITEM_CD = IT.PAY_ITEM_CD
 WHERE MM.EMP_NO = '962001'
   AND MM.PY_YM = '201606'
   AND MM.PAY_PY_FLAG = '1'
 GROUP BY PAY_DEDU_FLAG,PR.PRNT_SEQ,IT.RN,IT.PRNT_NM
 ORDER BY PR.PRNT_SEQ
;


원하는 데이터 셋

PRNT_NM_1  PAY_ITEM_AMT_1  PAY_DEDU_FLAG_1   PRNT_NM_2  PAY_ITEM_AMT_2  PAY_DEDU_FLAG_2
직무급               948000                 1                      근속급         1381000                  1
기술업무            15000                   1                      보직수당           0                      1
.
.
.
.
.
.
사학연금대부        585560                2                       사학연금       410990                    2
고용보험                 0                     2                       건강보험       196000                    2

 

현재 결과

by 마농 [2016.08.29 13:35:46]

GROUP BY 항목들도 함께 찍어서 보여주세요.


by DONKEY [2016.08.29 13:55:17]

아래 그림이 위의 쿼리 결과로 나온 데이터 셋인데요.. 사실 현재 상태는 그룹바이 없이도 아래 그림과 같이 출력이 가능한데 그룹바이와 디코드를 사용해서 어떻게 해결 해보려고 했는데 안되서 어떻게 해야될지 갈피가 안잡혀서 글 쓰게 되었습니다..

SELECT DECODE(IT.RN,0,IT.PRNT_NM) AS PRNT_NM_1
     , DECODE(IT.RN,0,NVL(IP.PAY_ITEM_AMT,0)) AS PAY_ITEM_AMT_1
     , DECODE(IT.RN,0,CASE WHEN IT.PAY_DEDU_FLAG IN ('1','3') THEN '1' ELSE '2' END) AS PAY_DEDU_FLAG_1
     , DECODE(IT.RN,1,IT.PRNT_NM) AS PRNT_NM_2
     , DECODE(IT.RN,1,NVL(IP.PAY_ITEM_AMT,0)) AS PAY_ITEM_AMT_2
     , DECODE(IT.RN,1,CASE WHEN IT.PAY_DEDU_FLAG IN ('1','3') THEN '1' ELSE '2' END) AS PAY_DEDU_FLAG_2
     , IT.RN
  FROM MPP_MMPAYMST MM
 INNER JOIN MPB_PAYPRFITM PR    ON MM.PAY_CLS_PRFSHIP_FLAG = PR.PAY_CLS_PRFSHIP_FLAG
  LEFT OUTER JOIN MPP_PAYITEMPYDTL IP ON MM.EMP_NO = IP.EMP_NO AND MM.PY_YM = IP.PY_YM AND MM.PAY_PY_FLAG = IP.PAY_PY_FLAG AND PR.PAY_ITEM_CD = IP.PAY_ITEM_CD
  LEFT OUTER JOIN (SELECT PAY_ITEM_CD,PAY_DEDU_FLAG,PRNT_NM,MOD(ROW_NUMBER() OVER(PARTITION BY PAY_DEDU_FLAG ORDER BY PAY_ITEM_CD),2) RN FROM MPB_PAYITEM) IT ON PR.PAY_ITEM_CD = IT.PAY_ITEM_CD
 WHERE MM.EMP_NO = '962001'
   AND MM.PY_YM = '201606'
   AND MM.PAY_PY_FLAG = '1'
 ORDER BY PR.PRNT_SEQ
;

이결과로 나온 데이터 셋이 위 그림과 같습니다


by 마농 [2016.08.29 14:39:26]
SELECT pay_dedu_flag
     , MIN(DECODE(MOD(rn, 2), 1, prnt_nm     )) prnt_nm_1
     , MIN(DECODE(MOD(rn, 2), 1, pay_item_amt)) pay_item_amt_1
     , MIN(DECODE(MOD(rn, 2), 0, prnt_nm     )) prnt_nm_2
     , MIN(DECODE(MOD(rn, 2), 0, pay_item_amt)) pay_item_amt_2
  FROM (SELECT it.prnt_nm
             , NVL(ip.pay_item_amt, 0) pay_item_amt
             , CASE WHEN it.pay_dedu_flag IN ('1','3') THEN '1' ELSE '2' END AS pay_dedu_flag
             , ROW_NUMBER() OVER(
               PARTITION BY CASE WHEN it.pay_dedu_flag IN ('1','3') THEN '1' ELSE '2' END
               ORDER BY pr.prnt_seq
               ) rn
          FROM mpp_mmpaymst mm
         INNER JOIN mpb_payprfitm pr
            ON mm.pay_cls_prfship_flag = pr.pay_cls_prfship_flag
          LEFT OUTER JOIN mpp_payitempydtl ip
            ON mm.emp_no      = ip.emp_no
           AND mm.py_ym       = ip.py_ym
           AND mm.pay_py_flag = ip.pay_py_flag
           AND pr.pay_item_cd = ip.pay_item_cd
         INNER JOIN mpb_payitem it
            ON pr.pay_item_cd = it.pay_item_cd
         WHERE mm.emp_no      = '962001'
           AND mm.py_ym       = '201606'
           AND mm.pay_py_flag = '1'
        )
 GROUP BY pay_dedu_flag, CEIL(rn / 2)
 ORDER BY pay_dedu_flag, CEIL(rn / 2)
;

 


by DONKEY [2016.08.29 14:48:12]

한치 오차도없이 팽팽 잘돌아갑니다... 유용한 코드 또하나 얻어갑니다! 정진하겠습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입