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, 동적쿼리 등등 아무리 찾아봐도 이해가 가지 않습니다..
조그마한 정보라도 주시면 감사하겠습니다!
가변 컬럼은 정적 쿼리로는 불가능합니다.
최대 가능개수 만큼 고정으로 구현하세요.
가변으로 구현하려면 동적 쿼리.
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 ;