GROUP BY를 사용할 때 자꾸 하는 실수가 있다. 잊지 말자!
GROUP BY를 사용할 때 SELECT에서는 GROUP BY에 사용된 컬럼 또는 집계 함수를 적용한 컬럼만 올 수 있다.
Q. 그럼 Group by에 사용된 컬럼 또는 집계 함수를 적용한 컬럼 외의 다른 컬럼도 같이 조회하려면 어떻게 해야할까?
A. 서브쿼리를 사용해보자.
예제
아래 쿼리는 상품의 카테고리별로 가장 비싼 상품의 가격을 보여준다.
SELECT CATEGORY, MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;
| 상품의 카테고리별로 가장 비싼 상품의 가격뿐만 아니라 상품 이름까지 출력하려면 어떻게 해야할까?
과거 잘못 쓴 것 같은 글
상품의 카테고리별로 가장 비싼 상품의 가격을 조회하는 서브쿼리를 사용하여 상품 가격과 일치하는 레코드를 조회하는 메인쿼리를 작성하였다.메인쿼리에서 다시 한번 더 CATEGORY로 group by를 해주었다. 그 이유는 where절에 '가장 비싼 상품 가격과 일치할 때'라는 조건을 줬기 때문에 가격만 일치하면 관련 레코드는 모두 조회된다. 그렇기 때문에 메인쿼리에도Group by하여 상품의 카테고리별로 가장 비싼 상품만 조회될 수 있게 하였다.
SELECT CATEGORY, MAX(PRICE) MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY)
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;
→ 문제가 없는지는 더 공부해서 살펴봐야 알겠지만 어쨌든 PRODUCT_NAME 컬럼이 GROUP BY에 존재하지 않아 문제가 생길 것 같다는 생각을 뒤늦게 하게 되었다.
- FROM 절에 상품의 카테고리별로 가장 비싼 상품의 가격을 구하는 서브 쿼리를 두고 WHERE 절에는 각 테이블의 CATEGORY와 PRICE 컬럼을 연결한다.
SELECT F.CATEGORY, F.PRICE MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT F, (
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
) M
WHERE F.CATEGORY = M.CATEGORY AND F.PRICE = M.MAX_PRICE
ORDER BY MAX_PRICE DESC;
→ GROUP BY 절에 없는 컬럼을 조회할 땐 서브쿼리에서 GROUP BY 절을 사용한 후 다른 테이블과 조인하는 방법을 쓰고 있다...
Ref.
1. http://jason-heo.github.io/mysql/2014/03/05/char13-mysql-group-by-usage.html
2. https://wickedmagic.tistory.com/215
3. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=uukyh&logNo=221040529603
4. https://wikidocs.net/132723
5. https://school.programmers.co.kr/questions/38703
6. 프로그래머스 (식품분류별 가장 비싼 식품의 정보 조회하기) / https://school.programmers.co.kr/learn/courses/30/lessons/131116
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'Computer Science > Database' 카테고리의 다른 글
[SQL/MySQL] 시간대별 통계 내기 (0) | 2023.04.23 |
---|---|
[SQL/MySQL] Window 함수로 큰 값/작은 값 조회하기 (1) | 2023.04.20 |
[MySQL] MAX 함수 (0) | 2023.03.26 |
[MySQL] 가장 최근 날짜 조회하기 (0) | 2023.03.26 |
[SQL/Oracle] NULL 조회하기 (0) | 2023.03.09 |
GROUP BY를 사용할 때 자꾸 하는 실수가 있다. 잊지 말자!
GROUP BY를 사용할 때 SELECT에서는 GROUP BY에 사용된 컬럼 또는 집계 함수를 적용한 컬럼만 올 수 있다.
Q. 그럼 Group by에 사용된 컬럼 또는 집계 함수를 적용한 컬럼 외의 다른 컬럼도 같이 조회하려면 어떻게 해야할까?
A. 서브쿼리를 사용해보자.
예제
아래 쿼리는 상품의 카테고리별로 가장 비싼 상품의 가격을 보여준다.
SELECT CATEGORY, MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;
| 상품의 카테고리별로 가장 비싼 상품의 가격뿐만 아니라 상품 이름까지 출력하려면 어떻게 해야할까?
과거 잘못 쓴 것 같은 글
상품의 카테고리별로 가장 비싼 상품의 가격을 조회하는 서브쿼리를 사용하여 상품 가격과 일치하는 레코드를 조회하는 메인쿼리를 작성하였다.메인쿼리에서 다시 한번 더 CATEGORY로 group by를 해주었다. 그 이유는 where절에 '가장 비싼 상품 가격과 일치할 때'라는 조건을 줬기 때문에 가격만 일치하면 관련 레코드는 모두 조회된다. 그렇기 때문에 메인쿼리에도Group by하여 상품의 카테고리별로 가장 비싼 상품만 조회될 수 있게 하였다.
SELECT CATEGORY, MAX(PRICE) MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY)
GROUP BY CATEGORY
ORDER BY MAX_PRICE DESC;
→ 문제가 없는지는 더 공부해서 살펴봐야 알겠지만 어쨌든 PRODUCT_NAME 컬럼이 GROUP BY에 존재하지 않아 문제가 생길 것 같다는 생각을 뒤늦게 하게 되었다.
- FROM 절에 상품의 카테고리별로 가장 비싼 상품의 가격을 구하는 서브 쿼리를 두고 WHERE 절에는 각 테이블의 CATEGORY와 PRICE 컬럼을 연결한다.
SELECT F.CATEGORY, F.PRICE MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT F, (
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
) M
WHERE F.CATEGORY = M.CATEGORY AND F.PRICE = M.MAX_PRICE
ORDER BY MAX_PRICE DESC;
→ GROUP BY 절에 없는 컬럼을 조회할 땐 서브쿼리에서 GROUP BY 절을 사용한 후 다른 테이블과 조인하는 방법을 쓰고 있다...
Ref.
1. http://jason-heo.github.io/mysql/2014/03/05/char13-mysql-group-by-usage.html
2. https://wickedmagic.tistory.com/215
3. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=uukyh&logNo=221040529603
4. https://wikidocs.net/132723
5. https://school.programmers.co.kr/questions/38703
6. 프로그래머스 (식품분류별 가장 비싼 식품의 정보 조회하기) / https://school.programmers.co.kr/learn/courses/30/lessons/131116
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'Computer Science > Database' 카테고리의 다른 글
[SQL/MySQL] 시간대별 통계 내기 (0) | 2023.04.23 |
---|---|
[SQL/MySQL] Window 함수로 큰 값/작은 값 조회하기 (1) | 2023.04.20 |
[MySQL] MAX 함수 (0) | 2023.03.26 |
[MySQL] 가장 최근 날짜 조회하기 (0) | 2023.03.26 |
[SQL/Oracle] NULL 조회하기 (0) | 2023.03.09 |