DB/쿼리 문제풀이

프로그래머스 ORACLE 즐겨찾기가 가장 많은 식당 정보 출력하기

sshhhh 2023. 10. 6.

왜 이렇게 작성하면 안 될까?

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO 
GROUP BY FOOD_TYPE, REST_ID, REST_NAME
ORDER BY FOOD_TYPE DESC;

*GROUP BY로 묶으면 가장 상단에 있는 데이터들을 임의로 가져옵니다. SELECT에 MAX를 해도 최대값을 가져오는것이 아닌 그룹화된 테이블 가장 상단을 가져오게 된다

https://school.programmers.co.kr/questions/38854

📌SQL 쿼리 실행순서

https://monawa.tistory.com/125

 

 

1.서브쿼리내용

SELECT FOOD_TYPE, MAX(FAVORITES) FAVORITES
    FROM REST_INFO 
GROUP BY FOOD_TYPE

 

 

2.정답

SELECT FOOD_TYPE
       , REST_ID
       , REST_NAME
       , FAVORITES
    FROM REST_INFO
   WHERE (FOOD_TYPE, FAVORITES) IN (
                                       SELECT FOOD_TYPE, MAX(FAVORITES)
                                       FROM REST_INFO
                                       GROUP BY FOOD_TYPE 
                                   )
ORDER BY FOOD_TYPE DESC

"WHERE (FOOD_TYPE, FAVORITES) IN" 부분은 음식 타입과 인기도가 특정 목록 안에 있는지를 확인하는 조건입니다. 만약 해당 목록에 포함되면 그 행이 선택됨

 

 

 

<오류>

SELECT FOOD_TYPE, REST_ID, REST_NAME, SUM(FAVORITES) AS FAVORITES
    FROM REST_INFO 
GROUP BY FOOD_TYPE, REST_ID, REST_NAME --FOOD_TYPE만 쓰면 실행안됨
ORDER BY FOOD_TYPE DESC;

**SUM(FAVORITES)**과 같이 집계 함수를 사용하고 있습니다. 하지만 FOOD_TYPE, REST_ID, **REST_NAME**은 그룹화 기준이 아닌데, 이들 컬럼을 집계 함수 없이 그대로 SELECT 절에 사용하고 있기 때문에 오류가 발생합니다.

예를 들어, **FOOD_TYPE**을 그룹화 기준으로 사용하려면 REST_ID, REST_NAME 등의 컬럼은 집계 함수 없이 GROUP BY 절에 나열해야 합니다.

 

 

📌WHERE IN

주어진 목록 안에 있는 값과 일치하는 행을 선택하는데 사용

<예시1>

REST_ID    REST_NAME         CITY
---------------------------------
1          Restaurant A     New York
2          Restaurant B     Los Angeles
3          Restaurant C     Chicago
4          Restaurant D     New York
5          Restaurant E     Houston

우리는 New York와 Los Angeles에 위치한 식당을 선택하고 싶다고 가정

SELECT * FROM RESTAURANTS
WHERE CITY IN ('New York', 'Los Angeles');

이 쿼리는 CITY 열의 값이 'New York' 또는 'Los Angeles'와 일치하는 행을 선택하게 됩니다. 따라서 위의 테이블에서는 **REST_ID**가 1, 2, 4인 식당들이 선택되어 결과로 나타날 것입니다.

<예시2: 고객 주문 중 특정 상품을 주문한 주문번호 조회>

주문(Order) 테이블:

OrderID CustomerID ProductID

1 101 201
2 102 202
3 103 201
4 101 203

상품(Product) 테이블:

ProductID ProductName

201 ItemA
202 ItemB
203 ItemC

이 경우, "ItemA"와 "ItemC" 상품을 주문한 주문번호를 조회하기 위한 SQL 쿼리

SELECT OrderID
FROM Orders
WHERE ProductID IN (
    SELECT ProductID
    FROM Products
    WHERE ProductName IN ('ItemA', 'ItemC')
);

--WHERE ProductID IN (201,203) 이렇게 되서 조회되는 것

댓글