Doctor Pepper

[프로그래머스] 평균 일일 대여 요금 구하기 본문

프로그래밍/SQL

[프로그래머스] 평균 일일 대여 요금 구하기

Doctor Pepper 2024. 10. 16. 19:27

1. 문제 설명

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

Columns name Type Nullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

 

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

 

2. 문제

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

 

3. 예시

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

CAR_ID CAR_TYPE DAILY_FEE OPTIONS
1 세단 16000 가죽시트, 열선시트, 후방카메라
2 SUV 14000 스마트키, 네비게이션, 열선싴트
3 SUV 22000 주차감지센서, 후방카메라, 가죽시트

 

'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.

AVERAGE_FEE
18000

 

4. 정답

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

 

- SQL 작성 단계

  1.  SELECT 문 : 평균 값을 구하기 위해 AVG() 함수를 사용한다. 평균값을 반올림하기 위해 ROUND() 함수를 AVG()함수 외부에 사용한다.
  2.  FROM 문 : 데이터를 가져올 테이블을 선택한다. 여기서는 CAR_RENTAL_COMPANY_CAR 테이블을 선택한다.
  3.  WHERE 문: 조건을 추가하여 자동차 종류가 'SUV'인 경우만을 선택한다.

 

5. 설명(SELECT문)

- SELECT 문

SELECT 문은 SQL(Structured Query Language)에서 데이터베이스에서 데이터를 조회하기 위해 사용되는 기본적인 명령어이다. 이를 통해 특정 테이블에서 원하는 데이터를 선택하고, 필터링하며, 정렬하고, 집계하는 등의 작업을 수행할 수 있다.

 

- 사용 방법 및 SELECT 문 구성 요소

SELECT column1, column2 ...
FROM table_name
WHERE condition;
  •  SELECT : 조회할 컬럼을 지정한다. 여려 개의 컬럼을 쉼표(,)로 구분하여 나열할 수 있다.

     ex 1) users 테이블에서 name과 age 컬럼 데이터 조회

SELECT name, age
FROM user;

 

     ex 2) users 테이블의 모든 컬럼 조회

SELECT *
FROM users;
  •  FROM : 데이터를 조회할 테이블을 지정한다.

      ex 1) employees 테이블에서 데이터를 가져오기.

FROM employees;
  •  WHERE : 조건을 지정하여 특정 조건문에 맞는 데이터만 선택할 수 있다.

      ex 1) user 테이블에서 age가 30보다 큰 레코드만 선택

SELECT name, age
FROM user
WHERE age > 30;
  • ORDER BY 절 : 결과를 정렬하는 데 사용된다. 정렬할 컬럼을 지정하고 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있다.

      ex 1) name을 기준으로 오름차순 정렬

SELECT name, age
FROM user
WHERE age > 30
ORDER BY name ASC;
  • GROUP BY 절 : 집계 합수(ex. COUNT, AVG, SUM 등)를 사용할 때 데이터를 그룹화하는 데 사용된다. 일반적으로 SELECT 문에서 집계 함수를 함께 사용한다.

      ex 1) employees 테이블에서 department별로 그룹화하여 각 부서의 데이터 요약

SELECT name, department
FROM employees
GROUP BY department;
  • HAVING 절 : GROUP BY로 그룹화된 데이터에 대한 조건을 지정하는 데 사용된다. WHERE 절은 집계 함수가 적용되기 전의 데이터를 필터링하는 반면, HAVING 절은 집계 함수 결과에 대해 조건을 지정한다.

      ex 1) 그룹화된 결과에서 레코드 수가 10개 초과인 그룹만 선택

SELECT name, department
FROM employees
GROUP BY department
HAVING count(*) > 10;

 

- 다양한 구성 요소를 조합한 예제

SELECT department, COUNT(*) AS employee_count
FROM employees
WHERE salary > 50000
GROUP By department
HAVING COUNT(*) > 2
ORDER BY employee_count DESC;

 

  • employees 테이블에서 salary가 50000 초과인 데이터를 조회
  • 조회된 데이터를 각 department별로 묶고, 각 department 별로 직원 수가 2명 초과인 부서만 선택
  • 출력은 department, employee_count로 출력(직원 수 컬럼을 AS를 이용하여 employee_count로 설정)
  • 최종 결과를 employee_count 기준으로 내림차순으로 정렬

- 집계 함수 정리

COUNT() 특정 조건을 만족하는 행의 수를 계산
SUM() 특정 컬럼의 값을 모두 더함
AVG() 특정 컬럼의 평균값을 계산
MIN() 특정 컬럼의 최소값을 반환
MAX() 특정 컬럼의 최대값을 반환

 

- NULL 값 처리

SELECT 문에서 NULL 값을 처리하기 위해 IS NULL 또는 IS NOT NULL을 사용할 수 있다.

SELECT name
FROM users
WHERE email IS NOT NULL;

 

위 내용은 email 컬럼에 값이 있는 사용자만 조회한다.