일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터분석
- jd
- data analyst
- 크롤링
- 최종 프로젝트
- 프롬프트 엔지니어링
- 히트맵
- Chat GPT
- 서브쿼리
- 태블로
- lambda
- If
- 시각화
- 클러스터링
- 데이터 분석
- 프로젝트
- da
- SQL
- 기초프로젝트
- SQLD
- pandas
- streamlit
- 팀프로젝트
- 군집화
- Python
- cross join
- 기초통계
- 머신러닝
- 전처리
- GA4
- Today
- Total
세조목
SQL 예제 정리(23.12.18) 본문
프로그래머스 예제 75번
https://school.programmers.co.kr/learn/courses/30/lessons/151141#qna
# 자동차 종류가 '트럭'인 자동차
# 대여 기록별 대여 금액(컬럼명 FEE)을 구하여 HISTORY_ID, 대여금액 리스트 출력
# 대여금액 기준 내림차순, HISTORY_ID 기준 내림차순 정렬
75번 예제 요구사항이다.
이 예제에서는 대여금액을 구하는 것이 가장 메인이라고 생각한다.
대여금액을 구할때 할인율(DISCOUNT_RATE)도 반영을 해야하는데
이 할인율이 CAR_TYPE에따라 달라지고 DURATION_TYPE에 따라서도 달라져서
조건을 여러번 지정해줘야 한다.
그래서 어떻게 쿼리를 작성해야하나 고민하던 중
여러가지 조건을 지정할때 요긴하게 쓰이는 CASE WHEN절을 사용했다.
SELECT DISTINCT HISTORY_ID,
CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 BETWEEN 7 AND 29 THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) *
(SELECT 1-(DISCOUNT_RATE/100)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '7일 이상'))
WHEN DATEDIFF(END_DATE, START_DATE) + 1 BETWEEN 30 AND 89 THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) *
(SELECT 1-(DISCOUNT_RATE/100)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '30일 이상'))
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >=90 THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) *
(SELECT 1-(DISCOUNT_RATE/100)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '90일 이상'))
ELSE ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1)) END '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
이것이 정답 쿼리인데 처음에 나는
CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 BETWEEN 7 AND 29 THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) * 할인율)
의 '할인율' 부분에 숫자를 입력했다.
어차피 CAR_TYPE이 '트럭'이기때문에 대여일 조건에따라 변경되는 할인율만 기입하면 되겠다싶었다.
EX. CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 BETWEEN 7 AND 29 THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) *0.95)
그러나 그렇게 쿼리를 작성할 경우 CAR_TYPE이 바뀌었을 경우에 해당 쿼리를 사용할수가 없게된다.
그래서 할인율이 들어가는 부분에 숫자가 아닌 조건이 있는 서브쿼리문을 넣어줘서 조건이 바뀔때마다 할인율도
바뀌도록 해야한다.
위쪽 정답 쿼리문을 보면 할인율에 아래 코드가 들어가는데
SELECT 1-(DISCOUNT_RATE/100)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '7일 이상'
살펴보면 CAR_TYPE이 '트럭'이고 대여기간이 7일 이상인 것들의 할인율을 구하고 있는 것을 알 수 있다.
또한 본 예제에서 한 가지 더 알게된 점은
서브쿼리문은 SELECT절이든, FROM절이든, WHERE절이든 조건을 지정하고싶은 곳이면 어디든 사용할 수 있다는 점이다.
'데이터 분석 공부 > SQL' 카테고리의 다른 글
SQL 정리(STR_TO_DATE, SQL 실행 순서, 데이터 삭제)(23.12.29) (1) | 2023.12.30 |
---|---|
SQL 정리(Join - cross, left)(leetcode - 1280. Students and Examinations)(23.12.28) (1) | 2023.12.27 |
SQL 정리(Cross Join)(23.12.26) (0) | 2023.12.26 |
SQL 정리(self join)(23.12.22) (1) | 2023.12.22 |
SQL 정리(is와 null, 서브쿼리, char_length)(23.12.20) (0) | 2023.12.20 |