상봉동개발자

[프로그래머스] SQL 난이도 3, 4 문제들 본문

코테준비

[프로그래머스] SQL 난이도 3, 4 문제들

상봉동개발자 2022. 10. 13. 14:38
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
Comments