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 |