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 절에 따옴표("")로 감싼 컬럼의 별칭이 들어가면 안된다.
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 생성할 테이블명 AS (서브쿼리
SELECT 값 AS 생성할 컬럼명
UNION ALL
SELECT 값+1 FROM 생성할 테이블명
WHERE 값 < 종료조건
)