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
| ORDER_ID | VARCHAR | 주문 ID (PK) |
| RESTAURANT_ID | VARCHAR | 음식점 ID |
| USER_ID | VARCHAR | 회원 ID |
| ORDER_DATE | DATE | 주문 날짜 |
| TOTAL_PRICE | INT | 결제 금액 |
RESTAURANT
| RESTAURANT_ID | VARCHAR | 음식점 ID (PK) |
| RESTAURANT_NAME | VARCHAR | 음식점 이름 |
| FOOD_TYPE | VARCHAR | 음식 종류 (한식/중식/일식/양식 등) |
| ADDRESS | VARCHAR | 주소 |
예시 데이터
FOOD_ORDER
| 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
| R001 | 한우마당 | 한식 | 서울 강남구 |
| R002 | 사천성 | 중식 | 서울 마포구 |
| R003 | 스시히로 | 일식 | 서울 송파구 |
| R004 | 파스타노 | 양식 | 서울 용산구 |
예시 결과
| 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 를 어느 조건을 출력할때 어떤 방식으로 사용해야하는지 익힐 수 있는 문제였던거 같다.
'프로그래머스 SQL' 카테고리의 다른 글
| 7.프로그래머스 SQL lv3 (물고기 종류 별 대어 찾기) (0) | 2026.05.11 |
|---|---|
| 6. 프로그래머스 SQL lv.3 ( 조건에 맞는 사용자와 총 거래금액 조회하기 ) (0) | 2026.05.08 |
| 4.프로그래머스 SQL lv3 (조건에 맞는 사용자 정보 조회하기) (0) | 2026.05.03 |
| 3.프로그래머스 SQL lv2 (중복제거하기) (0) | 2026.05.03 |
| 2.프로그래머스 SQL lv2 (재구매가 일어난 상품과 회원 리스트 구하기) (0) | 2026.04.28 |