SQL

JOIN, GROUP BY를 동시에 사용하는 경우

zzugest1 2022. 12. 29. 19:34

https://school.programmers.co.kr/learn/courses/30/lessons/144855#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제는 다음과 같다. 

 

 

예를 들어 BOOK 테이블과 BOOK_SALES 테이블이 다음과 같다면

 

BOOK 

BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10000 2020-01-01
2 경제 1 9000 2021-02-05
3 경제 2 9000 2021-03-11

BOOK_SALES 

BOOK_ID SALES_DATE SALES
1 2022-01-01 2
2 2022-01-02 3
1 2022-01-05 1
2 2022-01-20 5
2 2022-01-21 6
3 2022-01-22 2
2 2022-02-11 3

2022년 1월의 도서 별 총 판매량은 도서 ID 가 1 인 도서가 총 3권, 도서 ID 가 2 인 도서가 총 14권 이고, 도서 ID 가 3 인 도서가 총 2권 이다.

 

카테고리 별로 판매량을 집계한 결과는 다음과 같다.

 

CATEGORY TOTAL_SALES
인문 3
경제 16

 

정답

SELECT B.CATEGORY, SUM(A.SALES) AS TOTAL_SALES FROM BOOK_SALES AS A
LEFT JOIN BOOK AS B
ON B.BOOK_ID=A.BOOK_ID
WHERE A.SALES_DATE LIKE '2022-01%'
GROUP BY CATEGORY 
ORDER BY CATEGORY

 

두 테이블의  공통행 BOOK_ID를 기준으로 LEFT JOIN을 한다. 그 후 22년 1월만 출력하기 위해 WHERE절을 이용한 후 

GROUP BY를 이용해 최종 결과를 출력한다. 여기서 중요한 점은 WHERE절은 GROUP BY보다 선행되어야 한다. 그렇다면 HAVING절을 이용하는 방법은 있지 않을까 의문이 들 수 있다. 

 

SELECT B.CATEGORY, SUM(A.SALES) AS TOTAL_SALES FROM BOOK_SALES AS A
LEFT JOIN BOOK AS B
ON B.BOOK_ID=A.BOOK_ID
GROUP BY CATEGORY 
HAVING A.SALES_DATE LIKE '2022-01%'
ORDER BY CATEGORY

HAVING절은 GROUP BY보다 밑에 실행되어야 하지만, 그룹을 나타내는 결과 집합의 행에만 적용된다. 따라서 조건이 주어진 SALES_DATE열은 그룹을 나타내는 행이 아니므로 위 코드는 오답이다. 

 

 

 

HAVING절과 WHERE절의 차이를 간단히 요약하면 아래와 같다.

  • Having은 그룹화 또는 집계가 발생한 후 레코드를 필터링하는데 사용된다.
  • Where은 그룹화 또는 집계가 발생하기 전에 레코드를 필터링하는데 사용된다.

 

 

'SQL' 카테고리의 다른 글

서브퀴리 응용(2)  (0) 2023.01.01
서브쿼리 응용  (0) 2022.12.30
FLOOR를 응용한 문제  (0) 2022.12.27
SQL) LEFT JOIN(2)  (0) 2022.12.26
SQL) LEFT JOIN(1)  (0) 2022.12.26