250x250
Notice
Recent Posts
Recent Comments
Link
상봉동개발자
[프로그래머스] SQL 난이도 3, 4 문제들 본문
728x90
즐겨찾기가 가장 많은 식당 정보 출력하기
- 사이트/난이도: 프로그래머스 / 3
- 코드
select food_type, rest_id, rest_name, favorites
from rest_info
where (food_type, favorites) in
(
select food_type, max(favorites)
from rest_info
group by food_type
)
order by food_type desc
# 원래 풀이
select food_type, rest_id, rest_name, max(favorites)
from rest_info
group by food_type
order by food_type desc
- 느낀점
- group by이용해서 즐겨찾기 가 가장 많은 식당정보를 출력했는데 틀렸다.
- 다른 사람풀이 보니까 직접 where절에 (Food_type, favorites)의 조건을 정해줌 ⇒
- 나랑 똑같은 생각을 한 사람들이 꽤 있다정리하면 group by하면 그룹함수들(Max, sum등)은 정확히 나오지만 나머지 컬럼들이 어떤 Row를 가지고 올지 모르기 때문이다. 그렇기 때문에 미리 최대 즐겨찾기에 해당하는 row를 가져와서 where 절에서 비교해야 한다.
- https://school.programmers.co.kr/questions/37656
조건별로 분류하여 주문상태 출력하기
- 사이트/난이도: 프로그래머스 / 3
- 코드
select order_id, product_id, out_date,
case
when out_date is null then "출고미정"
when datediff(out_date, '2022-05-01') <= 0 then "출고완료"
when datediff(out_date, '2022-05-01') > 0 then "출고대기"
end
as "출고완료"
from food_order
order by order_id
- 느낀점
- 조건별로 나눠야 되서 case when then 을 이용했다.
- 그리고 날짜 차이는 datediff 를 이용했다.
우유와 요거트가 담긴 장바구니
- 사이트/난이도: 프로그래머스 / 4
- 코드
select cart_id
from
(
select distinct cart_id, name
from cart_products
where name = "Yogurt" or name = "Milk"
) as b
group by b.cart_id
having count(b.cart_id) >= 2
order by cart_id
- 느낀점
- Group by까지는 생각했는데 milk, yogurt로만 이루어진 것으로 그룹화 할 것을 생각 못했음
- 다른 사람 풀이를 보니 from 절에 미리 milk, yougrt 로 이루어진 테이블을 만들고 여기서 cart_id로 그룹화해서 2이상이라면 출력하는 식으로 짯음
식품분류별 가장 비싼 식품의 정보 조회하기
- 사이트/난이도: 프로그래머스 / 4
- 코드
select category, price as max_price, product_name
from food_product
where (category, price) in
(
select category, max(price)
from food_product
group by category
having category in ("과자", "국", "김치", "식용유")
)
order by price desc
- 느낀점
- group by를 이용해서 푼 문제
- 여기서 group by를 서브쿼리에서 구현하였는데 위에서 푼 문제처럼 product_name에 최대 가격의 네임이아니라 다른 네임이 들어갈 수 있기 때문
서울에 위치한 식당 목록 출력하기
- 사이트/난이도: 프로그래머스 / 4
- 코드
SELECT ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address, ROUND(AVG(rr.review_score), 2) AS score
FROM rest_info ri
INNER JOIN rest_review rr
ON ri.rest_id = rr.rest_id
WHERE ri.address LIKE '서울%'
GROUP BY ri.rest_id
ORDER BY score DESC, ri.favorites DESC
- 느낀점
- join으로 먼저 묶고 group by 하는 문제
- 나는 group by한걸 Join으로 해서 틀렸음…
그룹별 조건에 맞는 식당 목록 출력하기
- 사이트/난이도: 프로그래머스 / 4
- 코드
-- 코드를 입력하세요
SELECT P.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d") REVIEW_DATE
FROM MEMBER_PROFILE P
INNER JOIN REST_REVIEW R
ON P.MEMBER_ID = R.MEMBER_ID
WHERE P.MEMBER_ID IN (
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
HAVING COUNT(*) = (
SELECT MAX(CNT)
FROM (
SELECT COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID
) A
)
)
ORDER BY R.REVIEW_DATE
- 느낀점
- 순서는 다음과 같다.
- group by 회원 count 찾기
- max값 찾기
- max 회원 찾기
- 회원의 이름, 리뷰, 날짜 찾기
- having count(*)= 에서 최대값 넣어야할 때 서브 쿼리를 두 번 써야되서 헷갈렸다.
- 순서는 다음과 같다.
5월 식품들의 총매출 조회하기
- 사이트/난이도: 프로그래머스 / 4
- 코드
-- 코드를 입력하세요
SELECT P.PRODUCT_ID, P.PRODUCT_NAME, (P.PRICE * SUM(O.AMOUNT)) AS TOTAL_SALES
FROM FOOD_PRODUCT P
INNER JOIN FOOD_ORDER O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE MONTH(O.PRODUCE_DATE) = 5
GROUP BY P.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID ASC
- 느낀점
- 꽤 쉽게 푼 문제
- JOIN으로 먼저 묶고 GROUP BY로 그룹화해서 TOTAL_PRICE를 손쉽게 계산했다.
728x90
'코테준비' 카테고리의 다른 글
| [백준] - 1182, 14391, 11727, 11052, 15990, 10844, 2193, 11053, 14002 (0) | 2022.10.19 |
|---|---|
| [프로그래머스] - 이상한 문자 만들기, 최대공약수와 최소공배수, [1차] 캐시, [3차] 파일명 정렬 (0) | 2022.10.17 |
| [프로그래머스] - 고득점 Kit 레벨 1~2 문제 (0) | 2022.10.12 |
| [프로그래머스] - 시저 암호, 스킬트리, 후보키, 타겟 넘버, N진수 게임 (0) | 2022.10.11 |
| [프로그래머스] - [1차] 비밀지도, 삼각 달팽이, 튜플, 방문길이 (0) | 2022.10.10 |
Comments