안녕하세요
pivot 기능을 사용하여 세로데이타를 가로로 나열하여 사용하는데
세로 데이타 갯수가 200개라 일일이 나열하지 않고 코드화 하여 함수를 사용하여
자동으로 가로로 나열하여 사용할려고 합니다.. sql 문에 함수 명령어를 사용할 수 있는 방법이 있을까요?
SELECT *
FROM (SELECT *
FROM pp_h202_tag
WHERE TAG_CD IN ( fn_h202_tag_nm_cross('1100','') ) )
PIVOT ( MAX(TAG_VALUE) FOR TAG_CD IN ( fn_h202_tag_nm_cross('1100','') ) );
select fn_h202_tag_nm_cross('1100','') from dual;
결과값 : 'LIA 1121','FRCS 1101-1A','FRS 1101-2A','TRC 1101-A','LICA 1101-A','PICA 1101-1A','PIA 1101-2A','PIA 1141-A','FIC 1101-3A','H2IC 1101-A','수첨량-1101A','FRCS 1101-1B','FRS 1101-2B','TRC 1101-B','LICA 1101-B','PICA 1101-1B','PIA 1101-2B','PIA 1141-B','FIC 1101-3B','H2IC 1101-B','수첨량-1101B','FRCS 1101-1C','FRS 1101-2C','TRC 1101-C','LICA 1101-C','PICA 1101-1C','PIC 1101-2C','PIC 1141-C','FIC 1101-3C','H2IC 1101-C','수첨량-1101C','FRCS 1101-1D','FRS 1101-2D','TRC 1101-D','LICA 1101-1D','PICA 1101-1D','PIA 1101-2D','FIC 1101-3D','H2IC 1101-D'
-----------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pispp.fn_h202_tag_nm_cross (
i_tag_dai IN pp_h202_tag_info.tag_dai%TYPE,
i_tag_jung IN pp_h202_tag_info.tag_jung%TYPE
)
RETURN VARCHAR2
IS
v_sql VARCHAR2 (5000) := ' ';
v_i NUMBER := 1;
BEGIN
FOR i IN (SELECT tag_nm
FROM pp_h202_tag_info
WHERE tag_dai = i_tag_dai --AND TAG_JUNG = i_TAG_JUNG
ORDER BY tag_seq)
LOOP
IF v_sql <> ' '
THEN
v_sql := v_sql || ''',''';
END IF;
IF v_i = 1
THEN
v_sql := v_sql || '''';
v_i := v_i + 1;
END IF;
v_sql := v_sql || i.tag_nm;
END LOOP;
v_sql := v_sql || '''';
IF v_sql = ' '
THEN
RETURN '';
ELSE
v_sql := v_sql;
RETURN v_sql;
END IF;
END;
함수에서 return되는 값은 단순히 문자열일 뿐이지 컴마로 구분되는 데이터셋이 아닙니다.
데이터셋이라고 하더라도 pivot 문의 in은 데이터셋을 받는 구문도 아니구요.
동적쿼리(쿼리를 문자열로 만들어 쿼리가 수행시점에서 결정되는..)를 사용하셔야 하구요.
굳이 function을 사용하시지 마시고
lag함수등으로 in절에 올 문자열을 만드시고
기존 쿼리에 append하셔서 쿼리를 실행하셔야할 것 같네요.
문자열1 = "select ~~~ pivot ~~ in ( "; 문자열2 = lag함수로 만든 문자열 값 v_sql = 문자열1 + 문자열2 + "))"; v_sql 실행