본문 바로가기

코딩테스트/SQL - 프로그래머스

SQL 고득점 kit(GROUP BY) - 저자 별 카테고리 별 매출액 집계하기

 

-- 풀이
-- '2022년 1월', '저자 별 카테고리 별 매출액', '저자 ID 오름차순, 카테고리 내림차순'

SELECT B.AUTHOR_ID
     , A.AUTHOR_NAME
     , B.CATEGORY
     , SUM(B.PRICE*BS.SALES) AS TOTAL_SALES
    FROM BOOK_SALES BS
    LEFT JOIN BOOK B
        ON BS.BOOK_ID = B.BOOK_ID
    LEFT JOIN AUTHOR A
        ON B.AUTHOR_ID = A.AUTHOR_ID
    WHERE YEAR(BS.SALES_DATE) = '2022'
        AND MONTH(BS.SALES_DATE) = '1'
    GROUP BY A.AUTHOR_NAME, B.CATEGORY
    ORDER BY A.AUTHOR_ID, B.CATEGORY DESC;

 

언뜻 보면 뭔가 많아 보이지만, JOIN만 잘 하고 조건만 잘 맞추고 출력할 것만 잘 출력해주면 되는 문제였다. 뭔가 어렵게 이것저것 생각할 필요 없이 문제에 써 있는 대로 줄줄줄 잘 쿼리만 작성하면 되는 문제.

어려운 문법 등도 없었던, 나름 평이한 문제였다.

 

** 조건에서처럼 특정 연도, 특정 월에 조건을 걸어주어야 하는 경우는 BETWEEN으로 해당 월의 1일부터 마지막 일까지를 걸어 줘도 되지만, 가끔 해당 월이 며칠까지 있는지 헷갈릴 때가 있다.

 

예를 들어 30일까지만 있는 월이 있고 31일까지 있는 월도 있다.

게다가, 윤달도 고려해야 하는 경우가 있다...

 Leetcode에 이런 문제가 있었다. 특정 연도의 2월로만 시간 조건을 걸어주어야 해서 1일부터 28일까지 걸어 줬는데, 틀렸다.

왜 틀렸나 알아보니 29일도 고려해야 했더라...

 

이런 경우를 미연에 방지하려면, 위의 내 풀이 쿼리처럼 그냥 연도랑 월을 박아주는 것이 차라리 나을 수가 있다.

 

 

 

덧. 24.02.08)

 

Big Query에서는 위의 YEAR()나 MONTH()같은 함수가 먹히지 않았다.

이렇게 먹히지 않을 때는 EXTRACT() 함수를 사용하도록 하자.