SELECT
인기있는 아이스크림(Lv1)
문제 설명
문제
상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요.
풀이
SELECT로 FLAVOR을 선택
ORDER BY에서 총 주문량을 내림차순 정렬, 출하 번호 기준으로 오름차순 정렬
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;
SUM, MAX, MIN
물고기 종류별 대어 찾기(Lv3)
문제 설명
문제
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
(단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.)
풀이
SELECT에서 ID, 물고기이름, 길이를 조회
JOIN에서 공통된 칼럼인 FISH_TYPE으로 두 테이블을 연결
WHERE에서 FISH_TYPE을 그룹화해서 FISH_TYPE, MAX(LENGTH)를 출력하는 서브쿼리를 작성
해당 서브쿼리의 값들을 메인쿼리에 넣어줌
ORDER BY에서 ID를 기준으로 오름차순 정렬
SELECT ID, FISH_NAME, LENGTH
FROM FISH_INFO
JOIN FISH_NAME_INFO USING (FISH_TYPE)
WHERE (FISH_TYPE, LENGTH) IN (
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE
)
ORDER BY ID;
GROUP BY
자동차 대여 기록에서 대여중/대여 가능 여부 구분하기(Lv3)
문제 설명
문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
풀이
WITH에서 22년 10월 16일이 시작날짜와 반납날짜 사이에 있는 CAR_ID를 조회하는 구문을 생성
SELECT에서 유니크한 CAR_ID, CASE WHEN으로 '대여가능 여부'를 조회
ORDER BY에서 CAR_ID를 기준으로 내림차순 정렬
WITH RENT AS (
SELECT car_id
FROM car_rental_company_rental_history
WHERE '2022-10-16' BETWEEN start_date AND end_date)
SELECT DISTINCT(car_id),
CASE
WHEN car_id IN (
SELECT car_id
FROM RENT
) THEN '대여중'
ELSE '대여 가능'
END availability
FROM car_rental_company_rental_history
ORDER BY 1 DESC;
IS NULL
잡은 물고기의 평균 길이 구하기(Lv1)
문제 설명
문제
잡은 물고기의 평균 길이를 출력하는 SQL문을 작성해주세요.
평균 길이를 나타내는 컬럼 명은 AVERAGE_LENGTH로 해주세요.
평균 길이는 소수점 3째자리에서 반올림하며, 10cm 이하의 물고기들은 10cm 로 취급하여 평균 길이를 구해주세요.
풀이
SELECT에서 IFNULL함수로 NULL값들을 10으로 변환시키고, 그 값으로 평균 길이를 구함
ROUND함수로 소수점 3째 자리에서 반올림하기 위해 ROUND( ,2)로 설정
칼럼명은 AVERAGE_LENGTH로 설정
SELECT ROUND(AVG(IFNULL(LENGTH, 10)), 2) AVERAGE_LENGTH
FROM FISH_INFO;
JOIN
오랜 기간 보호한 동물(1) (Lv3)
문제 설명
문제
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
풀이
SELECT에서 NAME, I.DATETIME(보호시작일)을 조회
JOIN에서 ANIMAL_ID를 기준으로 OUTS 테이블을 left join
WHERE에서 O.DATETIME이 NULL로 설정(입양을 못 간 동물이므로, INS 데이터만 존재해야함)
ORDER BY에서 보호 시작일을 오름차순 정렬
LIMIT 3으로 가장 오래 된 동물 3마리로 설정
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME
LIMIT 3;
String, Date
자동차 대여 기록에서 장기/단기 대여 여부 구분하기(Lv1)
문제 설명
문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
풀이
SELECT에서 모든 칼럼들과 CASE WHEN으로 시작날과 반납날의 차이를 계산한 RENT_TYPE를 조회
DATEDIFF함수의 경우 두 날짜의 차이를 계산함
ex) 04-01과 04-01을 DATEDIFF 함수에 넣으면 0이 나옴. 즉 하루를 빼주므로 29를 입력해야 30일 이상을 구할 수 있다!
WHERE에서 START_DATE를 22년 9월로 설정
ORDER BY에서 대여기록 ID를 기준으로 내림차순 정렬
SELECT
HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE,'%Y-%m-%d') START_DATE, DATE_FORMAT(END_DATE,'%Y-%m-%d') END_DATE,
CASE WHEN DATEDIFF(END_DATE,START_DATE) >= 29 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;
'SQL > 프로그래머스' 카테고리의 다른 글
프로그래머스 | JOIN - 없어진 기록 찾기 (+JOIN정리) (0) | 2024.09.10 |
---|---|
프로그래머스 | SQL 스터디 9 (1) | 2024.09.03 |
프로그래머스 | SQL 스터디 7 (0) | 2024.09.03 |
프로그래머스 | SQL 스터디 6 (0) | 2024.09.03 |
프로그래머스 | SQL 스터디 5 (0) | 2024.09.03 |