31. 오랜기간 보호한 동물 (1)
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/59044
정답 코드:
SELECT
ai.NAME,
ai.DATETIME
FROM ANIMAL_INS AS ai
LEFT JOIN ANIMAL_OUTS ao
ON ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE ao.DATETIME IS NULL
ORDER BY DATETIME ASC
LIMIT 3
문제 풀이때 했던 생각.
| # 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리 # 이름과 보호 시작일 # 결과는 보호 시작일 순으로 조회 |
다른 풀이
SELECT
NAME,
DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN(
SELECT ANIMAL_ID
FROM ANIMAL_OUTS )
ORDER BY DATETIME ASC
LIMIT 3
| 입양을 못갔다 == ANIMAL_OUTS에 기록되지 않았다 이기 때문에 WHERE절 서브쿼리를 사용해 기준컬럼을 만들어 비교하였다. |
다른 풀이 2
SELECT
NAME,
DATETIME
FROM ANIMAL_INS ai
WHERE NOT EXISTS(
SELECT 1
FROM ANIMAL_OUTS ao
WHERE AI.ANIMAL_ID = ao.ANIMAL_ID)
ORDER BY DATETIME ASC
LIMIT 3
| 존재 여부를 판단하는 문제이기 때문에 EXISTS를 사용해 판단했다. |
32. 카테고리 별 도서 판매량 집계하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/144855
정답 코드:
SELECT
b.CATEGORY,
SUM(bs.SALES) AS TOTAL_SALES
FROM BOOK b
INNER JOIN BOOK_SALES bs
on b.BOOK_ID = bs.BOOK_ID
WHERE YEAR(bs.SALES_DATE) = 2022 AND MONTH(bs.SALES_DATE) = 1
GROUP BY b.CATEGORY
ORDER BY CATEGORY ASC
문제 풀이때 했던 생각.
| # 2022년 1월의 카테고리 별 도서 판매량을 합산 # 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력 # 결과는 카테고리명을 기준으로 오름차순 정렬 |
33. 상품 별 오프라인 매출 구하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131533
정답 코드:
SELECT
P.PRODUCT_CODE,
SUM(p.PRICE * o.SALES_AMOUNT) AS SALES
FROM PRODUCT p
INNER JOIN OFFLINE_SALE o
ON p.PRODUCT_ID = o.PRODUCT_ID
GROUP BY PRODUCT_CODE
ORDER BY SALES DESC, p.PRODUCT_CODE ASC;
문제 풀이때 했던 생각.
| # 상품코드 별 매출액(판매가 * 판매량) 합계를 출력 # 결과는 매출액을 기준으로 내림차순 정렬, 매출액이 같다면 상품코드를 기준으로 오름차순 정렬 |
34. 있었는데요 없었습니다
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59043
정답 코드:
SELECT
ai.ANIMAL_ID,
ai.NAME
FROM ANIMAL_INS ai
LEFT JOIN ANIMAL_OUTS ao
on ai.ANIMAL_ID = ao.ANIMAL_ID
where ai.DATETIME > ao.DATETIME
ORDER BY ai.DATETIME ASC
문제 풀이때 했던 생각.
| # 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회 # 결과는 보호 시작일이 빠른 순으로 조회 |
35.오랜 기간 보호한 동물(2)
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59411
정답 코드:
SELECT
ai.ANIMAL_ID,
ai.NAME
FROM ANIMAL_INS ai
INNER JOIN ANIMAL_OUTS ao
ON ai.ANIMAL_ID = ao.ANIMAL_ID
ORDER BY DATEDIFF(ao.DATETIME , ai.DATETIME) DESC
LIMIT 2
문제 풀이때 했던 생각.
| # 입양을 간(INNER JOIN 사용) 동물 중, 보호 기간이 가장 길었던 동물 두 마리 # 아이디와 이름을 조회 # 결과는 보호 기간이 긴 순으로 조회 |
36. 보호소에서 중성화한 동물
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59045#fn1
정답 코드:
SELECT
ai.ANIMAL_ID,
ai.ANIMAL_TYPE,
ai.NAME
FROM ANIMAL_INS ai
INNER JOIN ANIMAL_OUTS ao
on ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE ai.SEX_UPON_INTAKE LIKE 'INTACT%' # 보호소에 들어올 당시에는 중성화 X
AND ao.SEX_UPON_OUTCOME NOT LIKE 'INTACT%' # 보호소를 나갈 당시에는 중성화 O
ORDER BY ai.ANIMAL_ID;
문제 풀이때 했던 생각.
| # 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물 # 동물의 아이디와 생물 종, 이름을 조회 # 아이디 순으로 조회 |
다른 풀이
SELECT
ANIMAL_ID,
ANIMAL_TYPE,
NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID in (
SELECT ANIMAL_ID
FROM animal_ins
WHERE SEX_UPON_INTAKE LIKE 'INTACT%' )
and (SEX_UPON_OUTCOME NOT LIKE 'INTACT%')
ORDER BY ANIMAL_ID;
| WHERE 절 서브쿼리로 풀이 보호소에 들어올 당시 중성화 x, 보호소를 나갈때 중성화된 동물의 ID를 출력한뒤 메인쿼리에서 비교 |
37. 조건에 맞는 도서와 저자 리스트 출력하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/144854
정답 코드:
SELECT
b.BOOK_ID,
a.AUTHOR_NAME,
DATE_FORMAT(b.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK b
LEFT JOIN AUTHOR a
on b.AUTHOR_ID = a.AUTHOR_ID
WHERE CATEGORY = "경제"
ORDER BY PUBLISHED_DATE ASC;
문제 풀이때 했던 생각.
| # '경제' 카테고리에 속하는 도서 # 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력 # 결과는 출판일을 기준으로 오름차순 정렬 |
38. 조건별로 분류하여 주문상태 출력하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/131113
정답 코드:
SELECT
ORDER_ID,
PRODUCT_ID,
DATE_FORMAT(OUT_DATE, "%Y-%m-%d") as OUT_DATE,
CASE
WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
ELSE "출고미정"
END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID ASC
문제 풀이때 했던 생각.
| # 2022년 5월 1일을 기준 # 출고여부는 2022년 5월 1일까지 출고완료, 이 후 날짜는 출고 대기로 미정이면 출고미정 # 주문 ID, 제품 ID, 출고일자, 출고여부를 조회 # 결과는 주문 ID를 기준으로 오름차순 정렬 |
39. 성분으로 구분한 아이스크림 총 주문량
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/133026
정답 코드:
SELECT
ii.INGREDIENT_TYPE,
SUM(fh.TOTAL_ORDER) AS TOTAL_ORDER
FROM ICECREAM_INFO ii
INNER JOIN FIRST_HALF fh
on ii.FLAVOR = fh.FLAVOR
GROUP BY ii.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER ASC
문제 풀이때 했던 생각.
| # 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량 # 총주문량을 나타내는 컬럼명은 TOTAL_ORDER # 총주문량이 작은 순서대로 조회(오름차순) # 필요한것 아이스크림 성분 타입, 성분 타입에 대한 아이스크림의 총주문량 |
40. 루시와 엘라 찾기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/59046
정답 코드:
SELECT
ANIMAL_ID,
NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID ASC
문제 풀이때 했던 생각.
| # 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물 # 동물의 아이디와 이름, 성별 및 중성화 여부를 조회 |
41. 조건에 맞는 도서 리스트 출력하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/144853
정답 코드:
SELECT
BOOK_ID,
DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC
문제 풀이때 했던 생각.
| # 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트 # 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력 # 결과는 출판일을 기준으로 오름차순 정렬 |
42. 평균 일일 대여 요금 구하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/151136
정답 코드:
SELECT
ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
문제 풀이때 했던 생각.
| # 자동차 종류가 'SUV'인 자동차, # 평균 일일 대여 요금을 출력 # 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림 # 컬럼명은 AVERAGE_FEE 로 지정 |
43. 조건에 맞는 사용자와 총 거래금액 조회하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/164668
정답 코드:
SELECT
U.USER_ID,
NICKNAME,
SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD B
INNER JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY U.USER_ID
HAVING SUM(B.PRICE) >= 700000
ORDER BY TOTAL_SALES ASC
문제 풀이때 했던 생각.
| # 완료된 중고 거래의 총금액이 70만 원 이상인 사람 # 회원 ID, 닉네임, 총거래금액을 조회 # 결과는 총거래금액을 기준으로 오름차순 정렬 |
다른 풀이
WITH TOTAL_PRICE AS (
SELECT
WRITER_ID,
SUM(PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD
WHERE STATUS = 'DONE'
GROUP BY WRITER_ID
HAVING SUM(PRICE) >= 700000
)
SELECT
u.USER_ID,
u.NICKNAME,
t.TOTAL_SALES
FROM USED_GOODS_USER u
INNER JOIN TOTAL_PRICE AS t
ON u.USER_ID = t.WRITER_ID
ORDER BY t.TOTAL_SALES ASC;
| FROM 절 서브쿼리를 사용해 문제풀이 가독성을 위해 CTE 사용 쓰고 보니 굳이 쓸 필요성을 못느낌 |
44. 가격대 별 상품 개수 구하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/131530
정답 코드:
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY FLOOR(PRICE / 10000) * 10000
ORDER BY PRICE_GROUP;
문제 풀이때 했던 생각.
| # 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문 # 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시 # 결과는 가격대를 기준으로 오름차순 정렬 # 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시 GROUP BY FLOOR(PRICE / 10000) * 10000 이 부분은 위에서 만든 PRICE_GROUP 값으로 행을 묶는 역할을 한다 내부에선 다음과 같은 형태로 만들어진다. 10000~19999인 그룹 20000~29999인 그룹 30000~39999인 그룹 |
45.3월에 태어난 여성 회원 목록 출력하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131120
정답 코드:
SELECT
MEMBER_ID,
MEMBER_NAME,
GENDER,
DATE_FORMAT(DATE_OF_BIRTH,'%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL
AND MONTH(DATE_OF_BIRTH) = 3
AND GENDER = 'W'
ORDER BY MEMBER_ID ASC
문제 풀이때 했던 생각.
| # 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회 # 이때 전화번호가 NULL인 경우는 출력대상에서 제외 # 결과는 회원ID를 기준으로 오름차순 정렬 |
46. 대여 기록이 존재하는 자동차 리스트 구하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/157341
정답 코드:
SELECT DISTINCT(CC.CAR_ID)
FROM CAR_RENTAL_COMPANY_CAR CC
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CH
ON CC.CAR_ID = CH.CAR_ID
WHERE CC.CAR_TYPE = '세단'
AND MONTH(CH.START_DATE) = 10
ORDER BY CC.CAR_ID DESC;
문제 풀이때 했던 생각.
| # 자동차 종류가 '세단'인 자동차 중 10월에 대여를 시작한 기록이 있는 자동차 # ID 리스트를 출력 자동차 ID 리스트는 중복이 없어야 함 # 자동차 ID를 기준으로 내림차순 정렬 |
48. 즐겨찾기가 가장 많은 식당 정보 출력하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/131123
정답 코드:
SELECT
r.FOOD_TYPE,
r.REST_ID,
r.REST_NAME,
r.FAVORITES
FROM REST_INFO r
INNER JOIN (
SELECT FOOD_TYPE, MAX(FAVORITES) AS MAXFAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE) AS f
ON r.FOOD_TYPE = f.FOOD_TYPE
AND r.FAVORITES = f.MAXFAVORITES
ORDER BY FOOD_TYPE DESC
문제 풀이때 했던 생각.
| # 음식종류별로 즐겨찾기수가 가장 많은 식당 # 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회 # 결과는 음식 종류를 기준으로 내림차순 정렬 |
다른 풀이
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
FAVORITES
FROM (
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
FAVORITES,
ROW_NUMBER() OVER (
PARTITION BY FOOD_TYPE
ORDER BY FAVORITES DESC
) AS rn
FROM REST_INFO
) t
WHERE rn = 1
ORDER BY FOOD_TYPE DESC;
| 랭크 함수를 사용해서 풀이 |
49. 식품분류별 가장 비싼 식품의 정보 조회하기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131116
정답 코드:
SELECT
f.CATEGORY,
f.PRICE AS MAX_PRICE,
f.PRODUCT_NAME
FROM FOOD_PRODUCT f
INNER JOIN (
SELECT CATEGORY,
MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY) AS mp
ON f.CATEGORY = mp.CATEGORY
AND f.PRICE = mp.MAX_PRICE
WHERE f.CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC
문제 풀이때 했던 생각.
| # 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회 # 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력 # 식품 가격을 기준으로 내림차순 정렬 |
다른 풀이
SELECT
CATEGORY,
PRICE AS MAX_PRICE,
PRODUCT_NAME
FROM (
SELECT
CATEGORY,
PRICE,
PRODUCT_NAME,
ROW_NUMBER() OVER (
PARTITION BY CATEGORY
ORDER BY PRICE DESC
) AS rn
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
) t
WHERE rn = 1
ORDER BY PRICE DESC;
| 랭크 함수를 사용해서 풀이 |
50. 5월 식품들의 총매출 조회하기
문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/131117
정답 코드:
SELECT
fp.PRODUCT_ID,
fp.PRODUCT_NAME,
SUM(fp.PRICE * fo.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT fp
INNER JOIN FOOD_ORDER fo
ON fp.PRODUCT_ID = fo.PRODUCT_ID
WHERE fo.PRODUCE_DATE >= '2022-05-01'
AND fo.PRODUCE_DATE < '2022-06-01'
GROUP BY fp.PRODUCT_ID, fp.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC, fp.PRODUCT_ID ASC
문제 풀이때 했던 생각.
| # 테이블에서 생산일자가 2022년 5월인 식품들 # 식품 ID, 식품 이름, 총매출을 조회 # 총매출을 기준으로 내림차순 정렬 식품 ID를 기준으로 오름차순 |
'E.코드카타 > Level 3' 카테고리의 다른 글
| 코드카타 Level 3 46, 48, 49, 50 (0) | 2026.01.09 |
|---|---|
| 코드카타 Level 3 43~45 (0) | 2026.01.08 |
| 코드카타 Level 3 39~42 (0) | 2026.01.07 |
| 코드카타 Level 3 34~38 (sql 복습시 참고) -나중에 서브쿼리로 풀어보기- (0) | 2026.01.06 |
| 코드카타 Level 3 1번~3번 (0) | 2026.01.05 |
