SELECT score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END AS grade
FROM student_scores;
SELECT CAR_ID,
CASE WHEN SUM(CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN 1
ELSE 0
END)>0 THEN '대여중' ELSE '대여 가능' END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
SUM(SALES * PRICE)는 각 항목의 매출을 합산하는 정확한 방식이고,
SUM(SALES) * PRICE는 총 판매량에 하나의 가격만 곱해 왜곡된 결과를 낳을 수 있다.
SELECT A.AUTHOR_ID,AUTHOR_NAME,CATEGORY,SUM(SALES*PRICE) AS TOTAL_SALES
FROM BOOK_SALES BS
JOIN BOOK B
ON BS.BOOK_ID = B.BOOK_ID
JOIN AUTHOR A
ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE MONTH(SALES_DATE) =1 AND YEAR(SALES_DATE)=2022
GROUP BY AUTHOR_ID,CATEGORY
ORDER BY AUTHOR_ID, CATEGORY DESC;
프로그래머스 : 식품분류별 가장 비싼 식품의 정보 조회하기
❌ 왜 틀렸는가?
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY = '과자' OR CATEGORY = '김치' OR CATEGORY = '국'
ORDER BY PRICE DESC;
MAX(PRICE)는 집계 함수지만, PRODUCT_NAME은 GROUP BY 대상도 아니고, 집계도 안 됨.
이러면 "그 MAX 가격에 해당하는 식품 이름이 어떤 건지"를 알 수 없기 때문에 SQL 문법적으로 오류 발생 or 잘못된 결과 출력.
✅ 어떻게 해결해야 하나?
→ MAX(PRICE)에 해당하는 식품 이름을 가져오려면,
서브쿼리를 사용해 최고 가격인 행 자체를 찾는 방식이 필요함.
MAX(PRICE)는 집계값이고 PRODUCT_NAME은 일반 컬럼이기 때문에,
GROUP BY로는 둘을 같이 조회할 수 없다.
따라서 최고 가격에 해당하는 행 전체를 추출하려면 서브쿼리나 RANK() 등의 방식이 필요하다.
🆗 정답코드
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY,PRICE) IN
(SELECT CATEGORY,MAX(PRICE)
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자','국','김치','식용유')
GROUP BY CATEGORY)
ORDER BY PRICE DESC;
Join으로 풀이
SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES
FROM REST_INFO R
JOIN
(SELECT MAX(FAVORITES) AS MAX_FAVORITES,FOOD_TYPE
FROM REST_INFO
GROUP BY FOOD_TYPE) AS M
ON R.FOOD_TYPE = M.FOOD_TYPE AND R.FAVORITES = M.MAX_FAVORITES
ORDER BY FOOD_TYPE DESC;
WHERE 절은 JOIN문 뒤에만 올 수 있다.
방법 1)
IFNULL(column,'text')
해당 column에 null이 발생하면 text로 출력
방법 2)
null인지 아닌지 판단
WHERE 조건 IS (NOT) NULL
WITH cte_name AS (
SELECT ...
)
SELECT ...
FROM cte_name;