SELECT A.HOPE_CD , LISTAGG(C.CITY_NM, ',') WITH GROUP (ORDER BY INSTR(',' || A.HOPE_CD || ',',',' || C.CITY_CD || ',')) AS HOPE_NM FROM TABLE A , TABE B WHERE 1=1 AND INSTR(',' || A.HOPE_CD || ',',',' || C.CITY_CD||',') > 0
GROUP BY A.HOPE_CD
HOPE_CD 가 데이터가 여러건이 들어와서 CITY_NM 을 이렇게 가져왔습니다
예를들면 HOPE_CD 데이터에 SEOUL,PUSAN,DAEGU
공백은 없습니다.
여기에 PAST_CD 라는 컬럼이 있습니다. 데이터는 HOPE_CD 와 같은 형식으로 들어옵니다
해당 쿼리에 SELECT 절에 같은 LISTAGG 를 쓰려고 하는데
SELECT A.HOPE_CD , LISTAGG(C.CITY_NM, ',') WITH GROUP (ORDER BY INSTR(',' || A.HOPE_CD || ',',',' || C.CITY_CD || ',')) AS HOPE_NM , A.PAST_CD , LISTAGG(C.CITY_NM, ',') WITH GROUP (ORDER BY INSTR(',' || A.PAST_CD || ',',',' || D.CITY_CD || ',')) AS PAST_NM FROM COM_CRP A , COM_CITY C , COM_CITY D WHERE 1=1 AND INSTR(',' || A.HOPE_CD || ',',',' || C.CITY_CD||',') > 0 AND INSTR(',' || A.PAST_CD || ',',',' || D.CITY_CD||',') >= 0 GROUP BY A.HOPE_CD, A.PAST_CD
이런식으로 추가를 해봤는데 에러가 납니다
두개 쓸 수 있는 방법이 있나요??
1. 오류 원인은?
- 오류 메시지를 보고 판단해야 할 것 같구요.
2. 구문 오류 말고도 논리적으로 조인이 잘못 되었습니다.
- (1 : 다) 조인은 가능하지만
- (1 : 다 : 다) 조인은 중복 자료 발생되므로 피해야 하는 조인입니다.
- (1 : 다) 를 집계하여 1로 만든 뒤 (1 : 다) 조인하는 단계적 처리가 필요합니다.
3. 기타 오류들
- 조인 조건 ( >= 0 ) 도 이퀄이 빠져야 할 것 같고
- LISTAGG 도 C.CITY_NM 이 아닌 D.CITY_NM 이 와야 하고요.
4. 기타 의문점
- HOPE_CD 가 키가 아닐 듯 한데?
- 집계 기준으로 HOPE_CD 를 사용하네요?
- HOPE_CD 외에 키컬럼이 집계 기준이 되어야 하는게 아닌지?
WITH com_crp AS ( SELECT 1 seq, 'SEOUL,PUSAN,DAEGU' hope_cd, 'ULSAN,SEOUL' past_cd FROM dual UNION ALL SELECT 2, 'SEOUL,DAEGU', 'ULSAN,SEOUL,PUSAN' FROM dual ) , com_city AS ( SELECT 'SEOUL' city_cd, '서울' city_nm FROM dual UNION ALL SELECT 'PUSAN', '부산' FROM dual UNION ALL SELECT 'DAEGU', '대구' FROM dual UNION ALL SELECT 'ULSAN', '울산' FROM dual ) SELECT * FROM (SELECT a.seq , a.gb , a.city_cd , c.city_nm , INSTR(','||a.city_cd||',', ','||c.city_cd||',') x FROM com_crp UNPIVOT (city_cd FOR gb IN (hope_cd, past_cd)) a , com_city c WHERE INSTR(','||a.city_cd||',', ','||c.city_cd||',') > 0 ) PIVOT (MIN(city_cd) cd, LISTAGG(city_nm, ',') WITHIN GROUP(ORDER BY x) nm FOR gb IN ('HOPE_CD' hope, 'PAST_CD' past)) ;