728x90
https://school.programmers.co.kr/learn/courses/30/lessons/144856
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
3개의 테이블에서 원하는 정보를 가져와야하는 문제이다.
SQL문제는 성능을 고려하지 않아도 되기 때문에 정말 많은 풀이가 존재한다.
1번 풀이
SELECT
author_id,
author_name,
category,
sum(sales * price) as total
FROM
(
SELECT
book_id,
book.author_id,
author.author_name,
category,
price
FROM BOOK JOIN AUTHOR
ON BOOK.AUTHOR_ID = AUTHOR.AUTHOR_ID
) books
JOIN
(
SELECT BOOK_ID, SUM(SALES) as sales
FROM BOOK_SALES
GROUP BY BOOK_ID, SALES_DATE
HAVING TO_CHAR(SALES_DATE, 'MM') = '01'
) sales
ON books.book_id = sales.book_id
GROUP BY author_id, author_name, category
ORDER BY author_id, category DESC
서브쿼리를 통해 책 정보, 작가 정보를 조인하고 책 판매 테이블에서 원하는 월수를 추출하고 그 둘을 조인하여 판매 가격을 측정했다.
이 쿼리는 서브쿼리를 두번이나 실행하기 때문에 효율적이라고 보기는 어렵다.
SELECT
a.author_id,
a.AUTHOR_NAME,
b.CATEGORY,
sum(price * SALES) as TOTAL_SALES
FROM BOOK b, AUTHOR a, BOOK_SALES bs
WHERE
b.AUTHOR_ID = a.AUTHOR_ID
AND bs.BOOK_ID = b.BOOK_ID
AND TO_CHAR(bs.SALES_DATE, 'MM') = '01'
GROUP BY a.author_id, a.AUTHOR_NAME, b.CATEGORY
ORDER BY a.author_id, b.category DESC;
WHERE 절을 통한 단순 조인, 적절한 그룹화를 통해 한번에 쿼리를 작성하였다. 웬만하면 서브쿼리를 작성하는 것은 실수를 할 여지도 있고 먼저 이렇게 조인 후 원하는 정보를 정재하는 것이 좋은 것 같다.
'프로그래머스 풀이 > Lv 4' 카테고리의 다른 글
[프로그래머스 SQL] 우유와 요거트가 담긴 장바구니 (ORACLE) (0) | 2025.03.05 |
---|---|
[프로그래머스 SQL] 년 월 성별 별 상품 구매 회원 수 구하기 ORACLE (0) | 2025.03.04 |
[프로그래머스 SQL] 서울에 위치한 식당 목록 출력하기(ORACLE) (0) | 2025.03.03 |
[프로그래머스 SQL] 5월 식품들의 총매출 조회하기 [ORACLE] (0) | 2025.01.25 |
[프로그래머스 SQL] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.11.29 |