본문 바로가기

SQL

oracle listagg 이용한 union 항목들 구분하기

SELECT

DT,

    MAX(GUBUN),

    LISTAGG(GUBUN,',') WITHIN GROUP(ORDER BY GUBUN) as GUBUN2

FROM

(

SELECT 

A.*    

FROM

(

SELECT '10:00' AS DT, 'A' AS GUBUN FROM DUAL

UNION ALL

SELECT '11:00' AS DT, 'A' AS GUBUN FROM DUAL

UNION ALL

SELECT '14:00' AS DT, 'A' AS GUBUN FROM DUAL

UNION ALL

SELECT '15:00' AS DT, 'A' AS GUBUN FROM DUAL

UNION ALL

SELECT '16:00' AS DT, 'A' AS GUBUN FROM DUAL

) A

UNION ALL

SELECT

B.*

FROM

(

SELECT '12:00' AS DT, 'B' AS GUBUN FROM DUAL

UNION ALL

SELECT '13:00' AS DT, 'B' AS GUBUN FROM DUAL

UNION ALL

SELECT '14:00' AS DT, 'B' AS GUBUN FROM DUAL

) B

UNION ALL

SELECT 

C.*

FROM

(

SELECT '13:00' AS DT, 'C' AS GUBUN FROM DUAL

UNION ALL

SELECT '14:00' AS DT, 'C' AS GUBUN FROM DUAL

UNION ALL

SELECT '15:00' AS DT, 'C' AS GUBUN FROM DUAL

) C

) ALL_T

GROUP BY DT


결과

DT  | MAX(GUBUN) | GUBUN2

10:00 A A

11:00 A A

12:00 B B

13:00 C B,C

14:00 C A,B,C

15:00 C A,C

16:00 A A


이렇게 listagg 함수를 이용하면 그루핑할때

해당 그룹에 포함이 된 테이블과 아닌 테이블을 구분할 수 있습니다.

B 테이블의 경우 12시 13시 14시에만 포함이 되어있죠.

쿼리 돌려보시면 금방 이해가 갈듯 합니다.

그러므로 자세한 설명은 생략!!