pivot 사용시 함수 사용가능 문의 0 1 1,968

by 유재희 [SQL Query] pivot 함수 [2017.12.18 17:33:59]


안녕하세요

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;

by jkson [2017.12.18 18:11:43]

함수에서 return되는 값은 단순히 문자열일 뿐이지 컴마로 구분되는 데이터셋이 아닙니다.

데이터셋이라고 하더라도 pivot 문의 in은 데이터셋을 받는 구문도 아니구요.

동적쿼리(쿼리를 문자열로 만들어 쿼리가 수행시점에서 결정되는..)를 사용하셔야 하구요.

굳이 function을 사용하시지 마시고

lag함수등으로 in절에 올 문자열을 만드시고

기존 쿼리에 append하셔서 쿼리를 실행하셔야할 것 같네요.


문자열1 =
"select
~~~
pivot ~~ in ( ";

문자열2 = lag함수로 만든 문자열 값

v_sql = 문자열1 + 문자열2 + "))";

v_sql 실행

 

 

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