1. https://school.programmers.co.kr/learn/courses/30/lessons/151141
<sql />
--ORACLE
/*
CAR_RENTAL_COMPANY_CAR
CAR_RENTAL_COMPANY_RENTAL_HISTORY
CAR_RENTAL_COMPANY_DISCOUNT_PLAN
자동차 종류가 트럭인 대여기록에서 기록별로 금액 구해 대여기록 ID와 대여금액 리스트 출력
정렬은 대여금액기준 내림차순, 대여기록ID 내림차순
*/
SELECT DISTINCT b.HISTORY_ID, (CASE
WHEN b.END_DATE - b.START_DATE + 1 >= 90 THEN a.DAILY_FEE * (b.END_DATE - b.START_DATE + 1) * ((100-(
SELECT DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '90일 이상'
))/100)
WHEN b.END_DATE - b.START_DATE + 1 >= 30 THEN a.DAILY_FEE * (b.END_DATE - b.START_DATE + 1) * ((100-(
SELECT DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '30일 이상'
))/100)
WHEN b.END_DATE - b.START_DATE + 1 >= 7 THEN a.DAILY_FEE * (b.END_DATE - b.START_DATE + 1) * ((100-(
SELECT DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '7일 이상'
))/100)
ELSE a.DAILY_FEE * (b.END_DATE - b.START_DATE + 1)
END
) AS FEE
FROM CAR_RENTAL_COMPANY_CAR a
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY b
ON a.CAR_ID = b.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN c
ON a.CAR_TYPE = c.CAR_TYPE
WHERE a.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC
2. https://school.programmers.co.kr/learn/courses/30/lessons/151139
이건 다시 볼 필요 있을듯. 위도 더 좋은 코드가 있었겠지만, 이건 혼자 푸는걸 사실상 실패함...
<sql />
/*
Oracle
TABLE : CAR_RENTAL_COMPANY_RENTAL_HISTORY
대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차만
기간동안 ID별 총 대여 횟수
정렬은 월 기준 오름차순, 자동차 ID 내림차순
대여횟수가 0이면 결과에서 제외
*/
/*
--기간동안 대여 횟수가 5회 이상인 차량들을 골라내는 쿼리
SELECT CAR_ID, COUNT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_DATE('2022-08-01', 'YYYY-MM-DD') <= START_DATE
AND TO_DATE('2022-10-31', 'YYYY-MM-DD') >= START_DATE
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5
ORDER BY CAR_ID DESC
*/
/*
--실패. 원인 파악중...
SELECT MONTH, CAR_ID, (COUNT(*)) AS RECORDS
FROM (
SELECT TO_NUMBER(TO_CHAR(START_DATE, 'MM')) as MONTH, CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_DATE('2022-08-01', 'YYYY-MM-DD') <= START_DATE
AND TO_DATE('2022-11-01', 'YYYY-MM-DD') > START_DATE
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5
)
AND TO_CHAR(START_DATE, 'YYYY') = '2022'
) a
GROUP BY MONTH, CAR_ID
HAVING COUNT(*) > 0
ORDER BY MONTH ASC, CAR_ID DESC
*/
SELECT MONTH, CAR_ID, RECORDS FROM (
SELECT MONTH, CAR_ID, COUNT(CAR_ID) OVER (PARTITION BY MONTH, CAR_ID) AS RECORDS,
COUNT(CAR_ID) OVER (PARTITION BY CAR_ID) AS ALL_RECORDS
FROM (
SELECT HISTORY_ID, TO_NUMBER(LTRIM(TO_CHAR(START_DATE,'MM'),'0')) AS MONTH, CAR_ID,
START_DATE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= TO_DATE('20220801','YYYY-MM-DD')
AND START_DATE < TO_DATE('20221101','YYYY-MM-DD')
)
) WHERE ALL_RECORDS >= 5
GROUP BY MONTH, CAR_ID, RECORDS
HAVING COUNT(*) > 0 -- 수정된 부분
ORDER BY MONTH, CAR_ID DESC;
3. https://school.programmers.co.kr/learn/courses/30/lessons/151138
<sql />
/*
CAR_RENTAL_COMPANY_RENTAL_HISTORY
대여시작일이 2022-09에 속하면서, 대여기간이 30일 이상이면 장기 대여
아니면 단기 대여 로 표시하는 컬럼 추가해 출력
대여기록 ID 기준으로 내림차순 정렬
*/
SELECT HISTORY_ID, CAR_ID,
TO_CHAR(START_DATE, 'YYYY-MM-DD') AS START_DATE,
TO_CHAR(END_DATE, 'YYYY-MM-DD') AS END_DATE,
(CASE
WHEN END_DATE - START_DATE + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END
) AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE, 'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;
4. https://school.programmers.co.kr/learn/courses/30/lessons/151137
<sql />
/*
CAR_RENTAL_COMPANY_CAR
옵션중에 통풍시트, 열선시트, 가죽시트 중에 하나 이상의 옵션을 포함한 차량이 몇대인가?
*/
SELECT CAR_TYPE, COUNT(CAR_TYPE) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;
5. https://school.programmers.co.kr/learn/courses/30/lessons/151136
<sql />
/*
CAR_RENTAL_COMPANY_CAR
자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL
평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림
컬럼명은 AVERAGE_FEE
*/
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
GROUP BY CAR_TYPE
6. https://school.programmers.co.kr/learn/courses/30/lessons/144856
<sql />
/*
BOOK, AUTHOR, BOOK_SALES
2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여,
저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.
*/
SELECT AUTHOR_ID, (SELECT AUTHOR_NAME FROM AUTHOR WHERE AUTHOR_ID = a.AUTHOR_ID) AS AUTHOR_NAME, CATEGORY, SUM(TOTAL_SALES)
FROM (
SELECT a.AUTHOR_ID, b.AUTHOR_NAME, a.CATEGORY, (a.PRICE * c.SALES) AS TOTAL_SALES
FROM BOOK a
JOIN AUTHOR b
on a.AUTHOR_ID = b.AUTHOR_ID
JOIN BOOK_SALES c
on a.BOOK_ID = c.BOOK_ID
WHERE TO_CHAR(c.SALES_DATE, 'YYYY-MM') = '2022-01'
) a
GROUP BY AUTHOR_ID, CATEGORY
ORDER BY AUTHOR_ID ASC, CATEGORY DESC;
/*
BOOK, AUTHOR, BOOK_SALES
2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여,
저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.
*/
SELECT a.AUTHOR_ID,
(SELECT AUTHOR_NAME FROM AUTHOR WHERE AUTHOR_ID = a.AUTHOR_ID) AS AUTHOR_NAME,
a.CATEGORY, SUM(a.PRICE * c.SALES) AS TOTAL_SALES
FROM BOOK a
JOIN BOOK_SALES c
on a.BOOK_ID = c.BOOK_ID
WHERE TO_CHAR(c.SALES_DATE, 'YYYY-MM') = '2022-01'
GROUP BY AUTHOR_ID, CATEGORY
ORDER BY AUTHOR_ID ASC, CATEGORY DESC
7. https://school.programmers.co.kr/learn/courses/30/lessons/144855
<sql />
/*
BOOK BOOK_SALES
2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문
결과는 카테고리명을 기준으로 오름차순
*/
SELECT CATEGORY, SUM(b.SALES) AS TOTAL_SALES
FROM BOOK a
JOIN BOOK_SALES b
ON a.BOOK_ID = b.BOOK_ID
WHERE TO_CHAR(b.SALES_DATE, 'YYYY-MM') = '2022-01'
GROUP BY a.CATEGORY
ORDER BY a.CATEGORY ASC;
8. https://school.programmers.co.kr/learn/courses/30/lessons/144854
<sql />
/*
BOOK AUTHOR
'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
*/
SELECT BOOK_ID,
(SELECT AUTHOR_NAME FROM AUTHOR WHERE AUTHOR_ID = BOOK.AUTHOR_ID) AS AUTHOR_NAME,
TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK
WHERE CATEGORY = '경제'
ORDER BY PUBLISHED_DATE ASC;
9. https://school.programmers.co.kr/learn/courses/30/lessons/144853
<sql />
/*
BOOK
BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트
도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL
결과는 출판일을 기준으로 오름차순
*/
SELECT BOOK_ID, TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK
WHERE TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021'
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC;
10. https://school.programmers.co.kr/learn/courses/30/lessons/133027
<sql />
/*
FIRST_HALF JULY
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
SHIPMENT_ID는 JULY테이블의 SHIPMENT_ID의 외래 키입니다.
*/
SELECT FLAVOR
FROM (
SELECT FLAVOR, ROWNUM
FROM (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM (
SELECT SHIPMENT_ID, FLAVOR, TOTAL_ORDER FROM FIRST_HALF
UNION ALL
SELECT SHIPMENT_ID, FLAVOR, TOTAL_ORDER FROM JULY
) c
GROUP BY FLAVOR
ORDER BY TOTAL_ORDER DESC
) b
) a
WHERE ROWNUM <= 3;
--ROWNUM 3개를 뽑지만, DESC 해야하는것을 잊으면 안됨.