ORACLE Pivot 조건의 자리수 초과로 ORA-00918 : 열의 정의가 애매합니다. 오류 발생 0 1 4,356

by MacJuger [SQL Query] pivot ORA-00918 [2017.04.06 17:41:47]


ORACLE 11g 와 12c 를 사용하고 있습니다. 두 버전에서 공통적으로 발생하는 오류입니다.

 

ORACLE Pivot 에서 조건의 자리수가 길어지면 오류가 발생합니다.

단일 조건으로 pivot 실행할 수 없고, 칼럼 조합으로 pivot 을 실행하는데, 그 데이타의 길이가 길어지는 경우 오류가 발생합니다.

해결 방법이 없을까요?

아래 http://gent.tistory.com/42 [젠트의 프로그래밍 세상] 에서 발췌한 쿼리로 샘플을 만들어보았습니다.

--------------------------------------------
-- OK
--------------------------------------------
WITH temp_table AS
 (SELECT (to_date('20140101', 'YYYYMMDD') + LEVEL - 1) dte
    FROM dual
  CONNECT BY LEVEL - 1 <= to_date('20141231', 'YYYYMMDD') -
             to_date('20140101', 'YYYYMMDD'))
SELECT *
  FROM (SELECT to_char(dte, 'MM') || '월' mon,
               decode(to_char(dte, 'D'),
                      '1',
                      'SUNDAY',
                      '2',
                      'MONDAY',
                      '3',
                      'TUESDAY',
                      '4',
                      'WEDNESDAY',
                      '5',
                      'THURSDAY',
                      '6',
                      'FRIDAY',
                      '7',
                      'SATURDAY') week,
               dte
          FROM temp_table)
 pivot(COUNT(dte) FOR week IN('SUNDAY',
                              'MONDAY',
                              'TUESDAY',
                              'WEDNESDAY',
                              'THURSDAY',
                              'FRIDAY',
                              'SATURDAY'))
 ORDER BY mon;

--------------------------------------------
-- NG
--------------------------------------------
WITH temp_table AS
 (SELECT (to_date('20140101', 'YYYYMMDD') + LEVEL - 1) dte
    FROM dual
  CONNECT BY LEVEL - 1 <= to_date('20141231', 'YYYYMMDD') -
             to_date('20140101', 'YYYYMMDD'))
SELECT *
  FROM (SELECT to_char(dte, 'MM') || 'mon' mon,
               decode(to_char(dte, 'D'),
                      '1',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SUNDAY',
                      '2',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY MONDAY',
                      '3',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY TUESDAY',
                      '4',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY WEDNESDAY',
                      '5',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY THURSDAY',
                      '6',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY FRIDAY',
                      '7',
                      'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SATURDAY') week,
               dte
          FROM temp_table)
 pivot(COUNT(dte) FOR week IN('DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SUNDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY MONDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY TUESDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY WEDNESDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY THURSDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY FRIDAY',
                              'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SATURDAY'))
 ORDER BY mon;

동일한 쿼리로 보이지만, 조건이 길어질 경우 

ORA-00918 : 열의 정의가 애매합니다. 라는 오류가 발생합니다.

조건의 값이 29번째 자리까지 각 값이 고유하게 구별되지 않을 경우 오류가 발행합니다.

감사합니다.

by jkson [2017.04.06 17:55:26]
WITH temp_table AS
  (SELECT (to_date('20140101', 'YYYYMMDD') + LEVEL - 1) dte
     FROM dual
   CONNECT BY LEVEL - 1 <= to_date('20141231', 'YYYYMMDD') -
             to_date('20140101', 'YYYYMMDD'))
 SELECT *
   FROM (SELECT to_char(dte, 'MM') || 'mon' mon,
                decode(to_char(dte, 'D'),
                       '1',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SUNDAY',
                       '2',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY MONDAY',
                       '3',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY TUESDAY',
                       '4',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY WEDNESDAY',
                       '5',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY THURSDAY',
                       '6',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY FRIDAY',
                       '7',
                       'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SATURDAY') week,
                dte
           FROM temp_table)
  pivot(COUNT(dte) FOR week IN('DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SUNDAY' AS SUNDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY MONDAY' AS MONDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY TUESDAY' AS TUESDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY WEDNESDAY' AS WEDNESDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY THURSDAY' AS THURSDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY FRIDAY' AS FRIDAY,
                               'DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY DAY SATURDAY' AS SATURDAY))
  ORDER BY mon;

열명 길이제한 때문에 잘려서 같은 열명으로 인식해서 그런 것 같네요.

그런데 무슨 의도로 day day day .. 를 적어주신 건지..

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