Sparta/CODEKATA

[250820] 스파르타코딩 본캠프 12일차 (2)

junecho 2025. 8. 20. 15:21

💥  CODEKATA                                                                                                           

~50문제

튜터님 강의 듣고 찾아봤는데 수많은 기업들이 예약어는 대문자로 많이 쓰더라

그래서 소문자만 고집하던 것과 최대한 엔터를 덜 치는 고집을 바꾸기로 함

하지만 컬럼들 하나하나 다 엔터치는 건 못참겠다;

 

오늘의 코드카타 후기 : GROUP BY 실수하지 말자 !

 

 

49) 식품분류별 가장 비싼 식품의 정보 조회하기

# 내코드
# 결과는 맞는데, 자꾸 오답으로 나와서 뭔지 검색해봤다.
# 여태 group by 공식을 무시한 채로 코드를 작성하고 있었다 . ..!! 충격
SELECT 
    category, MAX(price) AS max_price, product_name
FROM 
    food_product
WHERE 
    category IN ('과자', '국', '김치', '식용유')
GROUP BY 
    category
ORDER BY 
    MAX(price) DESC
# 답코드1 - 서브쿼리, JOIN, MAX 사용
# 카테고리 별로 제일 비싼걸 서브쿼리로 묶기
SELECT 
    a.category, a.max_price, fp.product_name
FROM
    food_product fp
    JOIN (
        SELECT 
            category, MAX(price) AS max_price
        FROM 
            food_product
        WHERE 
            category IN ('과자', '국', '김치', '식용유')
        GROUP BY 
            category
    ) a ON fp.category = a.category AND fp.price = a.max_price
GROUP BY 
    a.category
ORDER BY 
    a.max_price DESC
# 답코드2 - 서브쿼리, RANK() 사용
# 이게 더 마음에 듦
SELECT 
    a.category, a.price as max_price, a.product_name
FROM 
    (
    SELECT 
        category, 
        RANK() OVER(PARTITION BY category ORDER BY price DESC) AS rnk,
        price, product_name
    FROM 
        food_product
    WHERE 
        category IN ('과자', '국', '김치', '식용유')
    ) a
WHERE 
    a.rnk = 1
ORDER BY 
    max_price desc

 

 

 

48) 즐겨찾기가 가장 많은 식당 정보 출력하기

위의 49번 문제랑 거의 동일함

왜 49번부터 풀었는지는 의문ㅎ

SELECT 
    a.food_type, a.rest_id, a.rest_name, a.favorites
FROM 
(
    SELECT 
        food_type, rest_id, rest_name, favorites,
        RANK() OVER(PARTITION BY food_type ORDER BY favorites DESC) AS rnk
    FROM 
        rest_info
) a
WHERE 
    a.rnk = 1
ORDER BY 
    food_type DESC

 

 

 

50) 5월 식품들의 총매출 조회하기

# 내코드
# 답은 맞는데 GROUP BY 또 실수했다...
SELECT 
    a.product_id, a.product_name, SUM(a.total) AS total_sales
FROM
(
    SELECT 
        fp.product_id, fp.product_name, (fp.price*fo.amount) as total
    FROM 
        food_product fp JOIN food_order fo ON fp.product_id = fo.product_id
    WHERE 
        fo.produce_date like "2022-05-%"
) a
GROUP BY 
    a.product_id
ORDER BY 
    total_sales DESC,
    a.product_id ASC
# 답코드 1
# 내 코드에서 GROUP BY에 a.product_name만 추가
SELECT 
    a.product_id, a.product_name, SUM(a.total) AS total_sales
FROM
(
    SELECT 
        fp.product_id, fp.product_name, (fp.price*fo.amount) as total
    FROM 
        food_product fp JOIN food_order fo ON fp.product_id = fo.product_id
    WHERE 
        fo.produce_date like "2022-05-%"
) a
GROUP BY 
    a.product_id, a.product_name
ORDER BY 
    total_sales DESC,
    a.product_id ASC
# 답코드 2
# 이건 join 3번해서 마음에 안듦
SELECT 
    a.product_id, a.product_name, b.total_sales
FROM 
    food_product a JOIN 
    (
        SELECT 
            fp.product_id, SUM(fp.price*fo.amount) as total_sales
        FROM 
            food_product fp JOIN food_order fo ON fp.product_id = fo.product_id
        WHERE 
            fo.produce_date like "2022-05-%"
        GROUP BY 
            fp.product_id
    ) b ON a.product_id = b.product_id
ORDER BY 
    b.total_sales DESC,
    a.product_id ASC