오라클 listagg 질문입니다 0 2 1,315

by Kaiger [SQL Query] [2019.06.25 17:16:38]


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

 

이런식으로 추가를 해봤는데 에러가 납니다

두개 쓸 수 있는 방법이 있나요??

by 마농 [2019.06.25 17:28:48]

1. 오류 원인은?
 - 오류 메시지를 보고 판단해야 할 것 같구요.
2. 구문 오류 말고도 논리적으로 조인이 잘못 되었습니다.
 - (1 : 다) 조인은 가능하지만
 - (1 : 다 : 다) 조인은 중복 자료 발생되므로 피해야 하는 조인입니다.
 - (1 : 다) 를 집계하여 1로 만든 뒤 (1 : 다) 조인하는 단계적 처리가 필요합니다.
3. 기타 오류들
 - 조인 조건 ( >= 0 ) 도 이퀄이 빠져야 할 것 같고
 - LISTAGG 도 C.CITY_NM 이 아닌 D.CITY_NM 이 와야 하고요.
4. 기타 의문점
 - HOPE_CD 가 키가 아닐 듯 한데?
 - 집계 기준으로 HOPE_CD 를 사용하네요?
 - HOPE_CD 외에 키컬럼이 집계 기준이 되어야 하는게 아닌지?


by 마농 [2019.06.26 08:48:15]
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))
;

 

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