[postgresql] 컬럼이 가변으로 증가하는 쿼리 질문 0 2 6,656

by 욱이 [SQL Query] SQL Query PostgreSql pivot 동적 쿼리 [2020.06.15 23:29:34]


안녕하십니까 선배님들 

현재 작업하고 있는 쿼리가 가변으로 컬럼이 증가해야합니다.

SELECT  T.cht_no
      , T.eqp_no
      , Z1.sort_def_code AS MAIN_SORT_CODE
      , Z2.SORT_DEF_CODE
FROM (
SELECT CHT_NO
     , EQP_NO
     , LINE_CODE 
  FROM MP_SMS_UNIT_MST
 WHERE CHT_USE_YN = 'Y'
 UNION ALL
SELECT B.SUB_CHT_NO
     , A.EQP_NO
     , A.LINE_CODE
  FROM MP_SMS_UNIT_MST A
  LEFT JOIN MP_SMS_UNIT_DTL B
         ON A.ID = B.PARENT_ID
 WHERE SUB_CHT_USE_YN = 'Y') T
 LEFT JOIN (SELECT * FROM
			MP_SMS_OP_SORT_CODE 
			WHERE LINE_OP_TYPE = '01-HUB-01'
			) Z1
        ON T.LINE_CODE = Z1.LINE_CODE
       AND T.CHT_NO = Z1.CHT_NO
 LEFT JOIN (SELECT * FROM MP_SMS_OP_DTL WHERE LINE_OP_TYPE = '01-HUB-01') Z2
        ON T.LINE_CODE = Z2.LINE_CODE
       AND T.CHT_NO = Z2.CHT_NO
     WHERE T.LINE_CODE = '01'
  ORDER BY CHT_NO

쿼리는 상기와 같으며 데이터는

 

"001";"301";"1A04";"1A04"
"001";"301";"1A04";"1A05"
"001";"301";"1A04";"1A14"
"001";"301";"1A04";"1A15"
"002";"401";"9999";""
"003";"302";"1A05";""
"004";"402";"XXXX";""
 

이런 방식으로 출력이 됩니다.

 

여기서, 아웃풋으로 나와야하는 데이터는

"001";"301";"1A04";"1A04";"1A05";"1A14";"1A15"
"002";"401";"9999";""
"003";"302";"1A05";""
"004";"402";"XXXX";""

이러한 방식으로 데이터가 출력이 되어야합니다.

 

반드시 쿼리로만 작업을 진행해야하는데.. 도저히 어떻게 진행을 해야할지.. 

pivot, 동적쿼리 등등 아무리 찾아봐도 이해가 가지 않습니다..

 

조그마한 정보라도 주시면 감사하겠습니다!

by 마농 [2020.06.16 08:15:09]

가변 컬럼은 정적 쿼리로는 불가능합니다.
최대 가능개수 만큼 고정으로 구현하세요.
가변으로 구현하려면 동적 쿼리.
 

SELECT cht_no
     , eqp_no
     , main_sort_code
     , MIN(CASE rn WHEN 1 THEN sort_def_code END) sort_1
     , MIN(CASE rn WHEN 2 THEN sort_def_code END) sort_2
     , MIN(CASE rn WHEN 3 THEN sort_def_code END) sort_3
     , MIN(CASE rn WHEN 4 THEN sort_def_code END) sort_4
     , MIN(CASE rn WHEN 5 THEN sort_def_code END) sort_5
     , MIN(CASE rn WHEN 6 THEN sort_def_code END) sort_6
     , MIN(CASE rn WHEN 7 THEN sort_def_code END) sort_7
     , MIN(CASE rn WHEN 8 THEN sort_def_code END) sort_8
     , MIN(CASE rn WHEN 9 THEN sort_def_code END) sort_9
  FROM (SELECT t.cht_no
             , t.eqp_no
             , z1.sort_def_code AS main_sort_code
             , z2.sort_def_code
             , ROW_NUMBER() OVER(PARTITION BY t.cht_no, t.eqp_no, z1.sort_def_code
                                     ORDER BY z2.sort_def_code) rn
          FROM (SELECT cht_no
                     , eqp_no
                     , line_code 
                  FROM mp_sms_unit_mst
                 WHERE cht_use_yn = 'Y'
                 UNION ALL
                SELECT b.sub_cht_no
                     , a.eqp_no
                     , a.line_code
                  FROM mp_sms_unit_mst a
                  LEFT JOIN mp_sms_unit_dtl b
                    ON a.id = b.parent_id
                 WHERE sub_cht_use_yn = 'Y'
                ) t
          LEFT JOIN mp_sms_op_sort_code z1
            ON z1.line_code    = t.line_code
           AND z1.cht_no       = t.cht_no
           AND z1.line_op_type = '01-HUB-01'
          LEFT JOIN mp_sms_op_dtl z2
            ON z2.line_code    = t.line_code
           AND z2.cht_no       = t.cht_no
           AND z2.line_op_type = '01-HUB-01'
         WHERE t.line_code = '01'
        ) a
 GROUP BY cht_no, eqp_no, main_sort_code
;

 


by 욱이 [2020.06.16 14:46:25]

마농님 답변감사합니다.

정말 많은 도움이 되었습니다.

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