프로그래머스 | SQL 스터디 3

2024. 9. 3. 19:32·SQL/프로그래머스

SELECT

평균 일일 대여 요금 구하기(Lv1)

문제 설명

​

문제

CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

​

풀이

SELECT로 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정

AVG(DAILY_FEE)를 ROUND( ,0)의 빈칸에 넣고 칼럼명 AVERAGE_FEE로 지정

​

WHERE문에서 CAR_TYPE ='SUV'로 차의 종류 설정

SELECT ROUND( AVG(DAILY_FEE) ,0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR 
WHERE CAR_TYPE = 'SUV';

​


SUM, MAX, MIN

최댓값 구하기(Lv1)

문제 설명

​

문제

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

​

풀이

SELECT에서 MAX(DATETIME)로 가장 최근에 들어온 동물의 시간을 조회할 수 있음

SELECT MAX(DATETIME)
FROM ANIMAL_INS;
 

GROUP BY

자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기(Lv2)

문제 설명

​

문제

CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

​

​

풀이

SELECT에서 CAR_TYPE, COUNT(*)으로 차의 종류와 해당하는 차의 개수를 조회

​

WHERE에서 통풍시트, 열선시트, 가죽시트가 포함되어 있는지 설정

​

GROUP BY에서 CAR_TYPE별로 그룹화

​

ORDER BY에서 CAR_TYPE별로 오름차순 정렬

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%'
   OR OPTIONS LIKE '%열선시트%'
   OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;

IS NULL

이름이 있는 동물의 아이디(Lv1)

문제 설명

​

문제

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

​

풀이

SELECT에서 ANIMAL_ID를 조회​

​

WHERE에서 이름이 있는 동물을 원하기에 NAME IS NOT NULL로 설정

​

ORDER BY에서 동물 ID 기준으로 오름차순 정렬

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC;

JOIN

5월 식품들의 총매출 조회하기(Lv4)

문제 설명

​

문제

FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요

​

풀이

SELECT에서 식품ID, 식품 이름, 총매출을 조회

여기서 총매출은 가격 * 주문량이며, 주문량의 경우 아래와 같이 5월 안에서도 다른 날 주문한 것들이 존재하기에 SUM을 씌워준다

​

두 테이블을 모두 사용해야하므로, 공통 컬럼인 PRODUCT_ID로 JOIN을 한다

​

WHERE에서 22년 5월의 생산일자의 제품들만 조회하기 위해 쿼리문 설정

​

GROUP BY에서 PRODUCT_ID와 PRODUCT_NAME을 기준으로 그룹화

※처음에는 group by를 쓰지 않아 틀렸었는데, 집계함수를 사용하기 때문에 집계의 기준이 되는 열을 지정해야 한다!!

​

ORDER BY에서 총매출 기준 내림차순 정렬, 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬

SELECT P.PRODUCT_ID, P.PRODUCT_NAME, PRICE*SUM(O.AMOUNT) TOTAL_SALES
FROM FOOD_PRODUCT P
JOIN FOOD_ORDER O ON O.PRODUCT_ID = P.PRODUCT_ID
WHERE O.PRODUCE_DATE LIKE '2022-05%'
GROUP BY P.PRODUCT_ID, P.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC, PRODUCT_ID;

String, Date

★자동차 대여 기록 별 대여 금액 구하기(Lv4)

문제 설명

​

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

​

​

풀이

SELECT에서 HISTROY_ID와 FEE를 조회

여기서 FEE는 DAILY_FEE * 대여기간 * 할인율(할인대상일때만) 의 식으로 설정

​

JOIN으로 CAR_RENTAL_COMPANY_RENTAL_HISTORY, CAR_RENTAL_COMPANY_DISCOUNT_PLAN를 연결

※ 여기서 기간의 차이를 계산할 때 +1이 되어야 하기 때문에 DURATION_TYPE 또한 새로 정의해줌

​

WHERE에서 CAR_TYPE이 트럭으로 설정

​

ORDER BY에서 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬

SELECT HISTORY_ID,
    ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE) + 1) * ( 100 - IFNULL(DISCOUNT_RATE, 0) ) / 100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D ON C.CAR_TYPE = D.CAR_TYPE
    AND D.DURATION_TYPE = (CASE
                                WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= '90' THEN '90일 이상'
                                WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= '30' THEN '30일 이상'
                                WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= '7' THEN '7일 이상'
                                ELSE NULL
                            END)
WHERE C.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC;

 

'SQL > 프로그래머스' 카테고리의 다른 글

프로그래머스 | SQL 스터디 6  (0) 2024.09.03
프로그래머스 | SQL 스터디 5  (2) 2024.09.03
프로그래머스 | SQL 스터디 4  (1) 2024.09.03
프로그래머스 | SQL 스터디 2  (0) 2024.09.03
프로그래머스 | SQL 스터디 1 (IFNULL, USING)  (0) 2024.09.03
'SQL/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | SQL 스터디 5
  • 프로그래머스 | SQL 스터디 4
  • 프로그래머스 | SQL 스터디 2
  • 프로그래머스 | SQL 스터디 1 (IFNULL, USING)
kimmalgu
kimmalgu
DA(데이터 분석가) 블로그
  • kimmalgu
    kimmalgu 님의 블로그
    kimmalgu
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 통계 (3)
      • [패캠] 데이터분석 부트캠프 (10)
        • 프로젝트 (2)
        • 수업 정리 (8)
      • 파이썬 (8)
        • 통계전산처리 (7)
      • SQL (27)
        • 프로그래머스 (20)
        • HackerRank (5)
        • LeetCode (1)
      • 코테 (0)
      • 독후감 (5)
  • 블로그 메뉴

    • 글쓰기
    • 홈
    • 태그
    • 방명록
  • hELLO· Designed By정상우.v4.10.0
kimmalgu
프로그래머스 | SQL 스터디 3
상단으로

티스토리툴바