https://school.programmers.co.kr/learn/courses/30/lessons/144856
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 사용시 중요한 점을 되새기면서 작성하니 통과했다.
하지만 가독성이 너무 안좋고 복잡하다.
이건 다른 사람이 푼 것을 보고 작성한 코드이다.
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만 쓰면 디폴트가 뭔지 궁금하다.
2) GROUP BY 할 때 AUTHOR_ID는 빼도 되는건가? 사실 GROUP_NAME이 있기 때문에 그룹바이엔 큰 의미가 없는데, SELECT 시 AUTHOR_ID도 있으니 일단 추가해줬는데... 없어도 되는건가?