해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 서브쿼리와 GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 보통 정도의 난이도를 가지고 있습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요
해당 문제에서 알아야 할 것은 집계함수를 쓴다고 해서 다른 컬럼 값이 집계함수 사용한 컬럼값의 동일한 행에 있는 값으로 바뀌지 않는다는 것입니다.(제가 이제 깨달은 것도 참...신기하네요 ㅎㅎ)
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
문제와 비슷한 내용이 출력 되긴하지만 현재 상태는 FAVORITES의 최댓값만 나온 것이며 해당 최댓값에 해당하는 REST_ID, REST_NAME은 바뀌지 않았다는 것입니다.
그래도 이것만 알고 푸신다면 기존에 했던 방식으로 풀면 되어 매우 쉽게 풀릴 것입니다.
1. FOOD_TYPE, FAVORITES의 최댓값만 가져오기
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
해당 값을 가져온 이유는 이 값을 WHERE절에 넣어 이에 맞는 값들만 가져오기 위해서 입니다!!
즉, 해당 쿼리는 서브 쿼리문이 될 것입니다.
2. WHERE절에 IN과 WHERE절을 이용하여 값 추출하기
SELECT *
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC
위의 이미지와 같이 FAVORITES가 가장 많은 값들이 잘 연결되어 가져온 것을 확인 할 수 있습니다.
해당 차이는 맨 위의 실수했던 값들과 비교하면 확실한 차이가 보일 것입니다.
ex) 일식에서 매장이름인 하이가쯔네 -> 스시사카우스로 알맞게 매칭
3. 조건에 맞게 출력하기
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC
최종적으로 문제에서 원하는 컬럼들만 가져와주면 해당 코드는 정답이 됩니다!!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
728x90
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기) (0) | 2024.11.01 |
---|---|
[SQL] Programmers 문제 풀기(저자 별 카테고리 별 매출액 집계하기) (0) | 2024.10.31 |
[SQL] Programmers 문제 풀기 (자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기) (0) | 2024.10.30 |
[SQL] Programmers 문제 풀기 (대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기) (0) | 2024.10.29 |
[SQL] Programmers 문제 풀기 (물고기 종류 별 대어 찾기) (0) | 2024.10.28 |