[프로그래머스] SQL 고득점 Kit 정리 - GROUP BY

susu·2023년 6월 23일
0

Algorithm & Coding Test

목록 보기
6/6
post-thumbnail

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

정답

SELECT 
	CATEGORY, 
    PRICE AS MAX_PRICE, 
    PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ("과자", "국", "김치", "식용유")
AND (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE)
                         FROM FOOD_PRODUCT
                         GROUP BY CATEGORY)
ORDER BY MAX_PRICE DESC

🚨 오답 주의

SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME,
FROM FOOD_PRODUCT
WHERE CATEGORY IN ("과자", "국", "김치", "식용유")
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;

제가 맨 처음에 문제를 보고 짰던 코드입니다.
얼핏 봐선 잘 작동하는 것처럼 보이지만, 실제로는 MAX(PRICE)로 도출된 금액에 해당하는 제품명과 실제 제품명이 다릅니다.
최대 가격인 MAX_PRICE는 해당 CATEGORY의 것이지만 제품명은 상위의 것이 무작위로 출력되는데,
이는 그룹핑의 대상에 제품명이 포함되기 않기 때문입니다.
따라서 이 문제는 카테고리 그룹핑만으로는 해결할 수 없고 WHERE (컬럼1, 컬럼2) IN~ 구문으로 해결해야 합니다.

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

정답

위 문제와 정확히 같은 유형입니다. (난이도가 왜 다른지는 모르겠습니다.)
그룹핑 대상 컬럼과, 집계함수가 적용되는 컬럼 둘을 서브쿼리로 SELECT해 WHERE IN~ 구문으로 걸러주어야 하는 문제입니다.

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 
	USER.USER_ID, USER.NICKNAME, SUM(PRICE) AS TOTAL_PRICE
FROM USED_GOODS_BOARD AS BOARD
JOIN USED_GOODS_USER AS USER ON BOARD.WRITER_ID=USER.USER_ID
WHERE BOARD.STATUS in ("DONE")
GROUP BY BOARD.WRITER_ID
HAVING TOTAL_PRICE >= 70*10000
ORDER BY TOTAL_PRICE;

📌 진료과별 총 예약 횟수 출력하기

정답

SELECT MCDP_CD AS "진료과코드", COUNT(*) AS "5월예약건수"
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD, "%Y-%m") = "2022-05"
GROUP BY MCDP_CD
ORDER BY COUNT(*), MCDP_CD;

🚨 ORDER BY 절에 따옴표("")로 감싼 컬럼의 별칭이 들어가면 안된다.

📌 입양 시각 구하기(2)

정답

with recursive time as (
    select 0 as hour
    union all
    select hour+1 from time
    where hour<23
)

SELECT 
    time.hour as hour,
    case when time.hour in (select date_format(a.datetime, "%H") 
    						from animal_outs) then count(*)
    else 0 end as count
from animal_outs as a
right join time on time.hour = date_format(a.datetime, "%H")
group by time.hour
order by time.hour;

with recursive 구문으로 SQL for문 구현

WITH RECURSIVE 생성할 테이블명 AS (서브쿼리
	SELECT 값 AS 생성할 컬럼명
    UNION ALL
    SELECT 값+1 FROM 생성할 테이블명
    WHERE 값 < 종료조건
)
profile
블로그 이사했습니다 ✈ https://jennairlines.tistory.com

0개의 댓글