[Oracle] WM_CONCAT 함수 - 여러 행을 하나의 행에 이어 붙여서 표현하기 (중복제거 가능)

톰톰·2023년 2월 8일
0

배경

한 구매자가 여러 개의 상품을 한 번에 구매했다고 가정해보자.
상품 00A, 00B, 00C, 00D를 구입해 오더번호 ORDER001이 생성되었다.
이 때 오더 테이블에서 ORDER001에 묶인 상품을 조회해 보면 다음과 같을 것이다.

오더번호 ORDER001에 포함된 상품 목록 조회해보자.

SELECT ORDER_NO, ITEM_NO
  FROM ORDER_TABLE
 WHERE ORDER_NO = 'ORDER001'
ORDER_NOITEM_NO
ORDER00100A
ORDER00100B
ORDER00100C
ORDER00100D

그렇다면 각 오더번호에 포함된 상품을 하나의 행으로 나타내고 싶다면?

이 때 사용할 수 있는 함수가 WM_CONCAT() 함수이다.

SELECT ORDER_NO, WM_CONCAT(DISTINCT ITEM_NO)
  FROM ORDER_TABLE
GROUP BY ORDER_NO
ORDER_NOITEM_NO
ORDER00100A,00B,00C,00D
ORDER00200B,00C,00D
ORDER00300C,00D

위의 쿼리와 같이 그룹핑 기준이 되는 컬럼(오더번호)을 GROUP BY로 묶고, 하나의 행에 이어 붙여서 표현하고 시픈 행을 WM_CONCAT()에 삽입하여 데이터를 원하는 형태로 추출할 수 있다. 이 때 중복을 제거해야 하므로 DISTINCT 키워드를 함께 넣어준다.

중복을 제거하지 않은 형태를 원한다면 WM_CONCAT 내의 DISTINCT를 제거하여 사용하면 된다.

SELECT ORDER_NO, WM_CONCAT(ITEM_NO)
  FROM ORDER_TABLE
GROUP BY ORDER_NO

다음과 같이 중복이 제거되지 않은 형태의 결과가 출력된다.

ORDER_NOITEM_NO
ORDER00100A,00B,00C,00D
ORDER00100A,00B,00C,00D
ORDER00100A,00B,00C,00D
ORDER00100A,00B,00C,00D
ORDER00200B,00C,00D
ORDER00200B,00C,00D
ORDER00200B,00C,00D
ORDER00300C,00D
ORDER00300C,00D

0개의 댓글