SQL 코딩테스트 대비

·2025년 6월 3일

1. CASE 문

기본 구조

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;

2. SUM(SALES*PRICE)

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;

3. GROUP BY에서 일반컬럼 조회 - 서브쿼리 사용

프로그래머스 : 식품분류별 가장 비싼 식품의 정보 조회하기

❌ 왜 틀렸는가?

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;

4. JOIN ON 후 WHERE

WHERE 절은 JOIN문 뒤에만 올 수 있다.

5. IS NULL

방법 1)

IFNULL(column,'text')

해당 column에 null이 발생하면 text로 출력

방법 2)
null인지 아닌지 판단

WHERE 조건 IS (NOT) NULL

6. WITH 테이블이름 AS ()

WITH cte_name AS (
    SELECT ...
)
SELECT ...
FROM cte_name;
profile
DevOps를 기반으로 한 클라우드, 알고리즘, 백엔드 관심있는 컴공생

0개의 댓글