(오라클/프로그래머) Lv4. 저자 및 카테고리별 총 판매액

문제 설명

다음은 서점에서 구할 수 있는 책의 도서정보(BOOK)와 저자정보(AUTHOR)의 표이다.

테이블은 각 책에 대한 정보를 담고 있는 테이블로 다음과 같은 구조를 가진다.

열 이름 유형 nullable 설명
BOOK_ID 정수 잘못된 책 ID
범주 VARCHAR(N) 잘못된 범주(경제, 인문, 소설, 생활, 기술)
AUTHOR_ID 정수 잘못된 저자 ID
가격 정수 잘못된 판매가격(원)
출시일 날짜 잘못된 출시일

작가 테이블은 책의 저자 정보를 담고 있는 테이블로 다음과 같은 구조를 가진다.

열 이름 유형 nullable 설명
AUTHOR_ID 정수 잘못된 저자 ID
저자 이름 VARCHAR(N) 잘못된 저자 이름

BOOK_SALE 테이블은 각 권의 날짜별 판매 정보를 담고 있는 테이블로 아래와 같은 구조를 가지고 있습니다.

열 이름 유형 nullable 설명
BOOK_ID 정수 잘못된 책 ID
SALES_DATE 날짜 잘못된 판매 날짜
판매 정수 잘못된 판매율

문제

2022년 1월의 도서 판매 데이터를 기준으로 저자 및 카테고리별 판매(TOTAL_SALES = 판매 * 판매 가격)이 검색되고 작성자 ID(AUTHOR_ID), 저자 이름(저자 이름), 범주(범주), 판매 (판매) 목록을 출력하는 SQL 문을 작성하십시오. 결과를 작성자 ID를 기준으로 오름차순으로 정렬하고, 작성자 ID가 동일한 경우 카테고리를 기준으로 내림차순으로 정렬합니다.

예를 들어 테이블과 작가 테이블, BOOK_SALE 테이블이 있을 때

BOOK_ID 범주 AUTHOR_ID 가격 출시일
하나 인문학 하나 10000 2020년 1월 1일
2 사업 하나 9000 2021-02-05
사업 2 9000 2021-03-11
AUTHOR_ID 저자 이름
하나 홍길동
2 김영호
BOOK_ID SALES_DATE 판매
하나 2022년 1월 1일 2
2 2022-01-02
하나 2022-01-05 하나
2 2022년 1월 20일 5
2 2022-01-21 6
2022-01-22 2
2 2022-02-11

2022년 1월 도서별 총 판매액은 도서 ID가 1 * 10,000원 ​​= 30,000원인 도서가 총 3권, 도서 ID가 2 * 9,000 = 126,000원인 도서가 총 14권 및 도서 ID가 인 도서입니다.

3권은 총 2권 * 9,000 = 18,000원입니다.

카테고리별, 작가별 매출을 집계하면 다음과 같습니다.

AUTHOR_ID 저자 이름 범주 총 매출
하나 홍길동 인문학 30000
하나 홍길동 사업 126000
2 김영호 사업 18000

작성자 ID, 범주 내림차순으로 정렬하면 다음과 같아야 합니다.

AUTHOR_ID 저자 이름 범주 총 매출
하나 홍길동 인문학 30000
하나 홍길동 사업 126000
2 김영호 사업 18000

설명

    SELECT A.AUTHOR_ID, C.AUTHOR_NAME, A.CATEGORY, SUM(B.SALES*A.PRICE)TOTAL_SALES
      FROM BOOK A
INNER JOIN (  SELECT BOOK_ID, SUM(SALES) SALES
                FROM BOOK_SALES
               WHERE TO_CHAR(SALES_DATE, 'YYYY-MM') = '2022-01'
            GROUP BY BOOK_ID) B
        ON A.BOOK_ID = B.BOOK_ID
INNER JOIN AUTHOR C
        ON A.AUTHOR_ID = C.AUTHOR_ID
  GROUP BY A.AUTHOR_ID, C.AUTHOR_NAME, A.CATEGORY
  ORDER BY 1, 3 DESC;

1. book 테이블을 기반으로 book_sales 테이블에 연결하여 판매 값의 합계(key – book_id)를 가져옵니다.

2. books 테이블을 기반으로 저자 테이블 및 저자 이름 정보를 가져옵니다.

(키 – author_id)

3. 세 개의 테이블을 여러 조인으로 결합하고 마지막으로 author_id, author_name 및 category별로 그룹화하여 sum()을 사용하여 total_sales를 가져옵니다.