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

kiki·2024년 1월 8일
0

프로그래머스

목록 보기
47/79

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/144856

문제 설명

  • 2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력
  • 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬

1차 시도 - 통과

SELECT AUTHOR.AUTHOR_ID, AUTHOR.AUTHOR_NAME, CATEGORY, SUM(TOTAL_SALES) FROM AUTHOR INNER JOIN 
    (SELECT B.BOOK_ID, B.CATEGORY, B.AUTHOR_ID, B.PRICE, D.TOTAL_SALES*PRICE AS TOTAL_SALES FROM BOOK B INNER JOIN 
        (SELECT BOOK_ID, SUM(SALES) AS TOTAL_SALES FROM BOOK_SALES 
         WHERE DATE_FORMAT(SALES_DATE,'%Y-%m')='2022-01'
         GROUP BY BOOK_ID) D
    ON B.BOOK_ID=D.BOOK_ID) A
    ON AUTHOR.AUTHOR_ID=A.AUTHOR_ID 
    GROUP BY AUTHOR_ID, AUTHOR_NAME, CATEGORY
    ORDER BY AUTHOR_ID, CATEGORY DESC;

엄청나게 복잡.... 서브 쿼리를 2개나 써서 작성한 코드다.
이 문제는 3개의 테이블이 있어서 약간 복잡해졌다.
처음엔 매출액을 계산하는 데 어려움이 있었는데, 다시한번 GROUP BY 사용시 중요한 점을 되새기면서 작성하니 통과했다.
하지만 가독성이 너무 안좋고 복잡하다.

2차 시도 - 통과

이건 다른 사람이 푼 것을 보고 작성한 코드이다.

SELECT A.AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(SALES*PRICE) AS TOTAL_SALES FROM BOOK_SALES BS
    INNER JOIN BOOK AS B ON B.BOOK_ID=BS.BOOK_ID
    INNER JOIN AUTHOR AS A ON A.AUTHOR_ID=B.AUTHOR_ID
    WHERE DATE_FORMAT(SALES_DATE,'%Y-%m')='2022-01'
    GROUP BY AUTHOR_ID, AUTHOR_NAME, CATEGORY
    ORDER BY AUTHOR_ID, CATEGORY DESC;

훨씬 가독성이 좋아졌다!
그리고 내가 JOIN할 때 두 테이블을 연달아서 쓸 수 있는 걸 몰랐기 때문에 위와같이 작성했었는데 하나 또 배웠다. 이렇게 하니 서브쿼리를 작성할 필요가 없다.
그리고 매출액을 SUM(SALES*PRICE)와 같이 간단하게 작성할 수 있다!

근데 궁금한 건,
1) JOIN만 써도 상관 없는건가? INNER라든지, LEFT 라든지... JOIN만 쓰면 디폴트가 뭔지 궁금하다.

  • 디폴트는 INNER다.

2) GROUP BY 할 때 AUTHOR_ID는 빼도 되는건가? 사실 GROUP_NAME이 있기 때문에 그룹바이엔 큰 의미가 없는데, SELECT 시 AUTHOR_ID도 있으니 일단 추가해줬는데... 없어도 되는건가?

  • AUTHOR_ID 필요하다! 만약에 이름이랑 카테고리가 중복되는 작가가 있다면 AUTHOR_ID만으로 구분 가능하니 필요하다.

정리

  • JOIN 여러개 쓰기: 서브쿼리를 쓰지 않고 JOIN을 이어서 쓰는 방법도 있다.

0개의 댓글