본문 바로가기

프로그래머스 풀이/Lv 4

[프로그래머스 SQL] 저자 별 카테고리 별 매출액 집계하기 (ORACLE)

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 절을 통한 단순 조인, 적절한 그룹화를 통해 한번에 쿼리를 작성하였다. 웬만하면 서브쿼리를 작성하는 것은 실수를 할 여지도 있고 먼저 이렇게 조인 후 원하는 정보를 정재하는 것이 좋은 것 같다.