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번째 자리까지 각 값이 고유하게 구별되지 않을 경우 오류가 발행합니다.
감사합니다.
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 .. 를 적어주신 건지..