코딩테스트

[26.03.30 코테/회고(MySQL/Oracle)]-저자 별 카테고리 별 매출액 집계하기

지니248 2026. 3. 30. 13:26

Lv4. 저자 별 카테고리 별 매출액 집계하기 (MySQL)

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

 

내가 작성한 코드

-- 풀이1
-- 2022년 1월 도서 판매량
WITH SALES_202201 AS (
    SELECT BOOK_ID, SUM(SALES) AS TOTAL_COUNT -- 1월 총 판매량
    FROM BOOK_SALES
    WHERE DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-01'
    GROUP BY BOOK_ID
)
SELECT B.AUTHOR_ID
       ,A.AUTHOR_NAME
       ,B.CATEGORY
       ,SUM(S.TOTAL_COUNT * B.PRICE) AS TOTAL_SALES
FROM SALES_202201 S
JOIN BOOK B 
  ON S.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A
  ON B.AUTHOR_ID = A.AUTHOR_ID
GROUP BY B.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY B.AUTHOR_ID ASC, B.CATEGORY DESC;

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

 

Oracle

-- 2022년 1월 도서 판매량
WITH SALES_202201 AS (
    SELECT BOOK_ID, SUM(SALES) AS TOTAL_COUNT -- 1월 총 판매량
    FROM BOOK_SALES
    WHERE TO_CHAR(SALES_DATE, 'YYYY-MM') = '2022-01'
    GROUP BY BOOK_ID
)
SELECT B.AUTHOR_ID
       ,A.AUTHOR_NAME
       ,B.CATEGORY
       ,SUM(S.TOTAL_COUNT * B.PRICE) AS TOTAL_SALES
FROM SALES_202201 S
JOIN BOOK B 
  ON S.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A
  ON B.AUTHOR_ID = A.AUTHOR_ID
GROUP BY B.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY B.AUTHOR_ID ASC, B.CATEGORY DESC;

 

문제 회고

1. 날짜 처리 방식의 차이

- MySQL : DATE_FORMAT(날짜, '%Y-%m-%d')

   - 구분자를 자유롭게 넣을 수 있다(-, /, .)

- Oracle : TO_CHAR(날짜, 'YYYY-MM-DD')

   - YYYY는 4자리, YY는 2자리, MON은 약어 월(JAN, FEB.. )등 예약어가 다양하다

- 데이터가 많을 때는 함수를 쓰는 대신 날짜 범위를 직접 비교하는 것이 성능상 유리하다

   - WHERE SALES_DATE >= '2022-01-01' AND SALES_DATE < '2022-02-01'