JAVA를 잡아라!...

MySQL_매출 현황 : GROUP_CONCAT, COALESCE, IFNULL 본문

팀 프로젝트

MySQL_매출 현황 : GROUP_CONCAT, COALESCE, IFNULL

onivv 2024. 3. 27. 20:39

상품별로 매출 현황을 보여주는 페이지 (이전에 작성한 내용)

본 글은 최종 쿼리문 ❌❌❌

 

한글코딩

  1. 상품별 카테고리 정보를 보여줄 CTE 작성
    • 상품별 카테고리 정보를 담고있는 CATEGORYZATION 테이블의 PRODUCT_PK 컬럼으로 그룹화
  2. 상품별 매출 및 상품 정보를 보여줄 CTE 작성
    • 상품 정보 PRODUCT 테이블과 상품별 구매 정보를 담고있는 BUYPRODUCT 테이블을 조인상품별 총 매출 = 상품PK로 그룹화, 상품별 가격과 구매 개수를 구해서 곱하기
    • 상품별 구매 개수 = BUYPRODUCT_CNT의 합계
    • 상품 PK로 그룹화
  3. 2개의 CTE 임시 테이블을 PRODUCT_PK로 조인해 필요한 컬럼의 데이터를 추출

 

#1 상품별 카테고리 정보를 보여줄 CTE 작성

 

상품별 카테고리 CTE 실행결과

#2 상품별 매출 및 상품 정보를 보여줄 CTE 작성

상품별 매출 CTE 실행 결과

#3 2개의 임시테이블을 PRODUCT_PK로 조인해 필요한 컬럼의 데이터 추출

CTE 2개 JOIN 후 실행 결과

 

 

[ 문자열 합치기_GROUP_CONCAT ]

프로젝트 설계 당시 하나의 상품은 큰 카테고리안에 여러개의 서브 카테고리를 가질 수 있었음

전체 결과값을 가져와서 JAVA로 for문을 돌며 여러개의 서브 카테고리를 붙여도 될 것 같긴했지만,

SELECT 쿼리로 결과값을 합쳐서 하나의 문자열로 주는것이 편할 것으로 생각되어 GROUP_CONCAT 함수를 사용

1개의 상품은 여러개의 SUB카테고리를 가질 수 있음
GROUP_CONCAT 함수 사용

 

[ NULL 값 대체 함수_IFNULL, COALESCE ]

▶ IFNULL

  • MySQL에서만 가능한 함수
  • single argument를 처리할 수 있음
  • ex) IFNULL(val, x) : val값이 null이면 x 반환, null이 아니면 val 반환

▶ COALESCE

  • SQL 표준 함수 : 다양한 데이터베이스 시스템이서 지원가능
  • multiple argument를 처리할 수 있음
  • ex) COALESCE(val1, val2, val3, ...) : val1값이 null이면 val2 반환, val2도 null이면 val3 반환

컬럼 비교 대상이 1개라서 COALESCE나 IFNULL이나 성능상 큰 차이가 없을 것으로 보임

따라서, 이번 프로젝트에서는 범용성이 좋은 COALESCE 함수 사용