https://school.programmers.co.kr/learn/courses/30/lessons/131116
처음에는 이렇게 짜면 될줄알았다.
SELECT category,
product_name,
MAX(price) AS price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유')
식용유 | 맛있는콩기름 | 8950 |
김치 | 맛있는배추김치 | 19000 |
국 | 맛있는미역국 | 2900 |
과자 | 맛있는포카칩 | 1950 |
하지만 스스로 미심쩍어서 확인해본 결과 ...
SELECT *
FROM food_product
WHERE category = '식용유'
ORDER BY price DESC
P0014 | 맛있는마조유 | CD_OL00004 | 식용유 | 8950 |
P0012 | 맛있는올리브유 | CD_OL00002 | 식용유 | 7200 |
P0013 | 맛있는포도씨유 | CD_OL00003 | 식용유 | 5950 |
P0011 | 맛있는콩기름 | CD_OL00001 | 식용유 | 4880 |
맛있는콩기름의 가격은 8950원이 아니다!
그저 맛있는콩기름이 식용유 중 첫번째 순서이기 때문에 위 쿼리를 실행했을 때 맛있는콩기름을 가져오는거다.
그래서 식품분류별 최고가를 먼저 뽑은 후에, 이를 다중열 서브쿼리를 활용해보려 한다.
WHERE절 서브쿼리에 들어갈 내용은 다음과 같다.
SELECT category,
MAX(price) AS price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유')
WHERE절 서브쿼리로 다중열 서브쿼리를 사용하고 싶은 경우, () 를 사용해줘야 한다.
[Solution]
SELECT category, price, product_name
FROM food_product
WHERE (category, price) IN
(SELECT category,
MAX(price) AS price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유'))
ORDER BY price DESC
이 풀이가 가장 효율적인지 확인하기 위해 다른 사람의 풀이를 찾아보았다.
WHERE절 서브쿼리가 헷갈리면 WITH를 활용해서 임시 테이블을 만든 후 사용할 수도 있다.
https://ittrue.tistory.com/420
WITH temp AS (
SELECT category,MAX(price) AS max_price
FROM food_product
GROUP BY category
HAVING category IN ('과자', '국', '김치', '식용유') -- GROUP BY 이후 조건은 HAVING
) -- WITH 를 사용하고 싶으면 AS 로 임시 테이블의 이름을 만들어줘야 함
SELECT t.category, t.max_price, f.product_name
FROM food_product f
INNER JOIN temp t ON f.category = t.category AND f.price = t.max_price -- INNER JOIN 으로 temp 에 있는 데이터만
ORDER BY t.max_price DESC -- 2 DESC 로도 가능
'SQL > 문제풀이' 카테고리의 다른 글
[프로그래머스] 입양 시각 구하기 (2) (0) | 2024.02.12 |
---|---|
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.02.12 |
[프로그래머스] 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.02.11 |
[프로그래머스] 강원도에 위치한 생산공장 목록 출력하기 (0) | 2024.02.10 |
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.01.09 |