📑
GROUP_CONCAT 📄
다른 컬럼의 내용을 합쳐서 보여주고 싶을 때 사용.
예를 들어 아래와 같은 테이블이 있을 때, 타입별로 해당하는 데이터를 한 컬럼 안에 모아서 보여주고 싶다면
TYPE | NAME |
A | almond |
A | avocado |
B | bee |
B | bottle |
C | carrot |
C | cocopalm |
D | drum |
D | date |
SELECT TYPE, GROUP_CONCAT(DISTINCT NAME) FROM WORD GROUP BY TYPE ;
와 같이 작성한다.
TYPE | NAME |
A | almond, avocado |
B | bee, bottle |
C | carrot, cocopalm |
D | drum, date |
다른 예시)
# 판매금액이 높은 순으로 판매수익, 수량, 구매자를 조회
SELECT
GOODS_NM '품목',
SUM(ORD_QY * SUPLY_PC) '판매수익',
SUM(ORD_QY) '수량',
GROUP_CONCAT(USER_NM, '(' ,ORD_QY, '개)' ORDER BY tor.USER_ID SEPARATOR ', ') '구매자'
FROM T_GOODS tg
JOIN T_ORD_DETAIL tod ON tg.GOODS_ID = tod.GOODS_ID
JOIN T_ORD tor ON tod.ORD_NO = tor.ORD_NO
JOIN T_USER tu ON tor.USER_ID = tu.USER_ID
GROUP BY tod.GOODS_ID
ORDER BY SUM(ORD_QY * SUPLY_PC) DESC
LIMIT 10;
중복되는 데이터를 제거하고 싶을 때는 DISTINCT를 붙여준다.
SEPARATOR(구분자) 값도 원하는 것을 지정해줄 수 있다. 공백도 가능.
GROUP_CONCAT((DISTINCT USER_NM ORDER BY tor.USER_id SEPARATOR '| ')
ORDER BY ALIAS
아래 두 쿼리는 ORDER BY 절을 다르게 적었는데 결과는 동일하게 반환된다.
SELECT
GOODS_NM '품목',
SUM(ORD_QY * SUPLY_PC) '판매수익',
SUM(ORD_QY) '수량',
GROUP_CONCAT(USER_NM, '(' ,ORD_QY, '개)' ORDER BY tor.USER_ID SEPARATOR ', ') '구매자'
FROM T_GOODS tg
JOIN T_ORD_DETAIL tod ON tg.GOODS_ID = tod.GOODS_ID
JOIN T_ORD tor ON tod.ORD_NO = tor.ORD_NO
JOIN T_USER tu ON tor.USER_ID = tu.USER_ID
GROUP BY tod.GOODS_ID
ORDER BY SUM(ORD_QY * SUPLY_PC) DESC
LIMIT 10;
SELECT
GOODS_NM '품목',
SUM(ORD_QY * SUPLY_PC) '판매수익',
SUM(ORD_QY) '수량',
GROUP_CONCAT(USER_NM, '(' ,ORD_QY, '개)' ORDER BY tor.USER_ID SEPARATOR ', ') '구매자'
FROM T_GOODS tg
JOIN T_ORD_DETAIL tod ON tg.GOODS_ID = tod.GOODS_ID
JOIN T_ORD tor ON tod.ORD_NO = tor.ORD_NO
JOIN T_USER tu ON tor.USER_ID = tu.USER_ID
GROUP BY tod.GOODS_ID
ORDER BY 판매수익 DESC
LIMIT 10;
하지만 아래와 같이 따옴표 안에 넣게 되면 실제 판매수익이 아닌 '판매수익'이라는 문자열을 기준으로 정렬하기 때문에 올바르게 정렬되지 않는다. (생각없이 썼다가 당황할 수 있음 (⊙_⊙))
...
ORDER BY '판매수익' DESC
LIMIT 10;