프로그래머스 MySQL Lv.2 (1)

Journey to Data Analyst·2023년 4월 1일
0

프로그래머스 MySQL

목록 보기
2/7

Lv.1 포스팅을 마쳤으니 이제 Lv.2 포스팅을 해보겠다!
Lv.2은 내용이 좀 많으므로 2개로 나누어 포스팅해보겠다!
Let's go!

1. 자동차 평균 대여 기간 구하기

문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_IDCAR_IDSTART_DATEEND_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column nameTypeNullable
HISTORY_IDINTEGERFALSE
CAR_IDINTEGERFALSE
START_DATEDATEFALSE
END_DATEDATEFALSE

문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.


예시

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

HISTORY_IDCAR_IDSTART_DATEEND_DATE
112022-09-272022-10-01
212022-10-032022-11-04
322022-09-052022-09-05
422022-09-082022-09-10
532022-09-162022-10-15
612022-11-072022-12-06

자동차 별 평균 대여 기간은

  • 자동차 ID가 1인 자동차의 경우, 대여 기간이 각각 5일, 33일, 30일인 기록이 존재하므로 평균 22.7일
  • 자동차 ID가 2인 자동차의 경우, 대여 기간이 각각 1일, 3일인 기록이 존재하므로 평균 2일
  • 자동차 ID가 3인 자동차의 경우, 대여 기간이 30일인 기록만 존재하므로 평균 30일 입니다. 평균 대여 기간이 7일 이상인 자동차는 자동차 ID가 1, 3인 자동차이고, 평균 대여 기간 내림차순 및 자동차 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.
CAR_IDAVERAGE_DURATION
330.0
122.7

Answer

-- 내 답안 
-- MySQL에서는 날짜끼리 연산하면 숫자로 인식함
SELECT CAR_ID, ROUND(AVG(END_DATE - START_DATE), 2) AS AVERAGE_DURARION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(END_DATE - START_DATE) >= 7
ORDER BY 2 DESC, 1 ASC;

-- 수정한 답안
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) 
							 AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

주석에 적은 것처럼 MySQL에서는 날짜끼리 연산하면 숫자로 인식하기 때문에
HAVING절의 숫자 조건에 정수로 날짜를 적어야 한다.
그리고 자세히 보면 AVERAGE_DURATION에 +1을 해야하는데
그 이유는 아래와 같다.
참고로 필자는 아직도 이 내용이 어렵다...

+ 1일이 있어야 하는 이유(타인의 답변)

  • 테이블을 조회해보면 car_id가 2인 데이터의 start_date가 2022-08-09, end_date가 2022-08-09인데 날짜를 셀 때는 9일부터 9일까지이면 하루라고 세니까 1을 더한다고 보시면 될 것 같아요.
    (참고로 datediff('2022-08-09', '2022-08-09') 값은 0입니다)
  • 시작한 날짜를 세기 위해서 +1을 해줘야 합니다!
    위 댓글처럼 DATEDIFF('2023-02-14', '2023-02-14')는 값이 0이 나오기 때문에 시작한 날짜부터 대여일로 계산해야 하는 위의 문제에서는 1을 더해줘야 합니다.

2. 카테고리 별 상품 개수 구하기

문제 설명

다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은 PRODUCT 테이블입니다. PRODUCT 테이블은 아래와 같은 구조로 되어있으며, PRODUCT_IDPRODUCT_CODEPRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.

Column nameTypeNullable
PRODUCT_IDINTEGERFALSE
PRODUCT_CODEVARCHAR(8)FALSE
PRICEINTEGERFALSE

상품 별로 중복되지 않는 8자리 상품코드 값을 가지며, 앞 2자리는 카테고리 코드를 의미합니다.


문제

PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.


예시

예를 들어 PRODUCT 테이블이 다음과 같다면

PRODUCT_IDPRODUCT_CODEPRICE
1A100001110000
2A10000459000
3C300000222000
4C300000615000
5C300001030000
6K100002317000

상품 카테고리 코드 별 상품은 아래와 같으므로,

  • A1PRODUCT_ID가 1, 2 인 상품
  • C3PRODUCT_ID가 3, 4, 5 인 상품
  • K1PRODUCT_ID가 6 인 상품

다음과 같은 결과가 나와야 합니다.

CATEGORYPRODUCTS
A12
C33
K11

Answer

SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY,
       COUNT(LEFT(PRODUCT_CODE, 2)) AS PRODUCTS FROM PRODUCT
GROUP BY 1
ORDER BY PRODUCT_CODE;

이번에는 MySQL에서 쿼리가 어떻게 수행되는지 알지 못해서
GROUP BY를 사용하는데에 애를 먹었다.
그래서 MySQL에서의 쿼리 수행 순서를 한번 알아보도록 하겠다.

MySQL 쿼리 수행 순서

  1. FROM and JOIN
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT (WINDOW FUNCTION도 이쯤에서 실행)
  6. ORDER BY
  7. LIMIT

3. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

문제 설명

다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_IDCAR_TYPEDAILY_FEEOPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

Column nameTypeNullable
CAR_IDINTEGERFALSE
CAR_TYPEVARCHAR(255)FALSE
DAILY_FEEINTEGERFALSE
OPTIONSVARCHAR(255)FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.


문제

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


예시

예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면

CAR_IDCAR_TYPEDAILY_FEEOPTIONS
1세단16000가죽시트,열선시트,후방카메라
2SUV14000스마트키,네비게이션,열선시트
3SUV22000주차감지센서,후방카메라
4트럭35000주차감지센서,네비게이션,열선시트
5SUV16000가죽시트,네비게이션,열선시트,후방카메라,주차감지센서

'통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차는 자동차 ID가 1, 2, 4, 5인 자동차이고, 자동차 종류 별로 몇 대인지 구하고 자동차 종류를 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.

CAR_TYPECARS
SUV2
세단1
트럭1

Answer

SELECT CAR_TYPE, COUNT(CAR_TYPE) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%시트%'
GROUP BY 1
ORDER BY 1;

SELECT CAR_TYPE AS CAR_TYPE, COUNT(CAR_TYPE) AS CARS 
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP ('통풍시트|열선시트|가죽시트')
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;

이번에는 LIKEREGEXP(정규표현식)을 번갈아 사용해보았다.
정규표현식을 한번에 정리하기에는 길기 때문에 다음에 시간이 남으면 좀 더 정리해보겠다!

profile
성장하는 주니어 데이터 분석가(Tableau, SQL and Python)

0개의 댓글