>

TIL

SQL GROUP_CONCAT

ekdud 2024. 12. 10. 10:14

📑

     

    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;