SQL

[프로그래머스] 5월 식품들의 총매출 조회하기

hminor 2024. 6. 17. 15:42
  • 작성한 쿼리 중 가장 긴 쿼리로
  • 따로 작성한 순서에 대해 나열하며 기억하려고 하는데
  • 우선 해당 문제는 아래와 같다.
    • 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 
    • 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 
    • 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 
    • 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하며
    • 대여 금액을 기준으로 내림차순 정렬하고, 
    • 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 
    • 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬
  • 여기서 테이블의 종류는 아래와 같다.
    • 보유 차 종류 1번 테이블: CAR_RENTAL_COMPANY_CAR
    • 렌탈 정보 2번 테이블: CAR_RENTAL_COMPANY_RENTAL_HISTORY
    • 종류별 할인 3번 테이블: CAR_RENTAL_COMPANY_DISCOUNT_PLAN
  • 이제 해당 문제를 해결하기 위해 
    • 첫 번째로는
      • 1번 테이블과 2번 테이블을 LEFT JOIN 해서 차 ID 그룹으로 묶어서
      • END_DATE의 일자가 2022-11-01 이전에 끝나서 렌트가 끝나거나 렌트한 날이 없다면
      • 해당 그룹의 가장 나중 일자의 ROW를 조회하기
      • 이후 A로 지정
    • 두 번째로는
      • 할인 테이블에서 문제 기간인 30일에 맞춰서
      • DURATION_TYPE을 30에 맞는 걸 찾고
      • 이후 CAR_TYPE이 세단 또는 SUV인것을 조회하기
      • 이후 B로 지정
    • 마지막으로 
      • 테이블간 같은 CAR_TYPE을 맡추고
      • 조건을 BETWEEN을 사용해서 DAILY_FEE와 30을 곱하고
      • 할인률 계산을 위해 100-DISCOUNT_RATE에 0.01을 곱하고
      • 해당 값이 50만 200만 사이의 값만 조회하도록 하고
      • SELECT 문에는 정수 값으로 나타내기 위해 CONVERT를 적용하는데 여기서
      • 첫 번째 인자로는 계산 값을 넣어주고
      • 두 번째 인자로는 UNSIGNED를 넣어주기
        • UNSIGNED은 정수만
        • SIGNED은 음수부터 양수까지 된다고만 기억하기
    • 이런 과정을 거치고 
      • ORDER BY를 사용해서 원하는대로 조회 순서 적용하여 해결
SELECT A.CAR_ID, A.CAR_TYPE, CONVERT(A.DAILY_FEE*30*((100-B.DISCOUNT_RATE)*0.01),UNSIGNED) AS FEE
FROM (SELECT A.CAR_ID, A.CAR_TYPE, A.DAILY_FEE, MAX(B.END_DATE) AS END_DATE
    FROM CAR_RENTAL_COMPANY_CAR A LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
    ON A.CAR_ID = B.CAR_ID
    WHERE A.CAR_TYPE IN ('SUV','세단') 
    GROUP BY B.CAR_ID
    HAVING '2022-11-01' > MAX(B.END_DATE) OR END_DATE IS NULL) A 
    JOIN (
    	SELECT CAR_TYPE, DISCOUNT_RATE
        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
        WHERE DURATION_TYPE LIKE "30%"
            AND CAR_TYPE IN ('세단', 'SUV')) B
ON A.CAR_TYPE = B.CAR_TYPE
WHERE A.DAILY_FEE*30*((100-B.DISCOUNT_RATE)*0.01) BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, 2, 1 DESC