데이터 분석

흐름을 읽고
인사이트를 만든다.

5.프로그래머스 SQL lv2.5 (다양한 음식을 즐긴 미식가 찾기 ai생성문제)

2026. 5. 4. 18:09프로그래머스 SQL

프로그래머스 SQL 문제를 풀다가 보니 lv2 는 너무 쉽고 lv3 는 아직 어려운 것 같아서 클로드를 통해 lv2.5 난이도의 문제를 생성해달라고 했다.

🍽️ 문제: 다양한 음식을 즐긴 미식가 찾기

문제 설명

FOOD_ORDER 테이블과 RESTAURANT 테이블을 참고하여, 2023년에 서로 다른 음식 종류(FOOD_TYPE)를 2가지 이상 주문하고, 총 결제 금액이 50,000원 이상인 회원의 정보를 조회하는 SQL을 작성해주세요.

결과는 총 결제 금액 기준 내림차순으로 정렬하며, 총 결제 금액이 같은 경우 USER_ID 오름차순으로 정렬합니다.


테이블 구조

FOOD_ORDER

ColumnTypeDescription
ORDER_ID VARCHAR 주문 ID (PK)
RESTAURANT_ID VARCHAR 음식점 ID
USER_ID VARCHAR 회원 ID
ORDER_DATE DATE 주문 날짜
TOTAL_PRICE INT 결제 금액

RESTAURANT

ColumnTypeDescription
RESTAURANT_ID VARCHAR 음식점 ID (PK)
RESTAURANT_NAME VARCHAR 음식점 이름
FOOD_TYPE VARCHAR 음식 종류 (한식/중식/일식/양식 등)
ADDRESS VARCHAR 주소

예시 데이터

FOOD_ORDER

ORDER_IDRESTAURANT_IDUSER_IDORDER_DATETOTAL_PRICE
O001 R001 U001 2023-03-05 25000
O002 R002 U001 2023-06-12 32000
O003 R003 U001 2023-08-20 18000
O004 R001 U002 2023-01-15 15000
O005 R004 U002 2023-09-30 28000
O006 R002 U003 2023-05-07 60000
O007 R001 U004 2022-11-11 40000
O008 R003 U004 2023-02-28 22000

RESTAURANT

RESTAURANT_IDRESTAURANT_NAMEFOOD_TYPEADDRESS
R001 한우마당 한식 서울 강남구
R002 사천성 중식 서울 마포구
R003 스시히로 일식 서울 송파구
R004 파스타노 양식 서울 용산구

예시 결과

USER_IDFOOD_TYPE_COUNTTOTAL_PRICE
U001 3 75000

U002는 총 결제 금액이 43,000원으로 50,000원 미만이라 제외
U003은 중식 1가지만 주문해서 제외
U004는 2023년 주문이 일식 1건뿐 (한식 주문은 2022년)이라 제외

 

문제 조건

1.2023년에 주문한 내역만 보기

2.서로 다른 음식 종류를 2가지 이상 주문한 회원만 뽑기

3.총 결제 금액이 5만원 이상인 회원 포함

문제 해결 과정

저번 블로그 포스팅에서도 다루었던 내용인데 처음에 음식 종류 수 조건을 WHERE 을 쓰려다가 COUNT 같은 집계 함수 결과에 조건을 거는건  HAVING 함수를 써야한다는 것을 공부해본게 도움이 되었다.

처음에 COUNT(R.FOOD_TYPE) 이라고 썼더니 같은 음식 종류를 여러 번 시켜도 다 세버렸다. "서로 다른 종류"니까 COUNT(DISTINCT R.FOOD_TYPE) 으로 DISTINCT를 활용해서 중복을 제거해줘야 한다.

그 후 HAVING 에 두 조건을 AND로 이어주고 ORDER BY로 깔끔하게 정렬해서 마무리 했다.

 

답변

SELECT
    FO.USER_ID,
    COUNT(DISTINCT R.FOOD_TYPE) AS FOOD_TYPE_COUNT,
    SUM(FO.TOTAL_PRICE) AS TOTAL_PRICE
FROM FOOD_ORDER FO
JOIN RESTAURANT R ON FO.RESTAURANT_ID = R.RESTAURANT_ID
WHERE YEAR(FO.ORDER_DATE) = 2023
GROUP BY FO.USER_ID
HAVING COUNT(DISTINCT R.FOOD_TYPE) >= 2
   AND SUM(FO.TOTAL_PRICE) >= 50000
ORDER BY TOTAL_PRICE DESC, FO.USER_ID ASC;

 

 

다시한번 COUNT,HAVING, DISTINCT 를 어느 조건을 출력할때 어떤 방식으로 사용해야하는지 익힐 수 있는 문제였던거 같다.