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))
;