본문 바로가기
Database/MySQL

GROUP BY, HAVING절

by 서초록 2021. 4. 28.

현업에서는 테이블 전체를 더하는 경우는 없고 특정 카테고리별로 더한다.

전체 데이터를 그루핑하는 방법을 배워보자.

예를 들어, 공급자별 평균가격을 구해보자.

SELECT SupplierID, AVG(Price)

FROM Products

GROUP BY SupplierID //그룹핑하는 기준 컬럼

 

여기서 카테고리별로도 보고싶다면

SELECT SupplierID, Categoryid, AVG(Price)

FROM Products

GROUP BY SupplierID,  Categoryid //그룹핑하는 기준 컬럼

 

따라서 여러가지 기준으로 그루핑하고싶다면 ,(콤마)찍고 이어주면됨.

 

MySQL에서는 GROUP BY 1, 2로도 쓸수 있다. SELECT에 있는 첫번째, 2번째 칼럼기준으로 그룹바이해라는 뜻

하지만 명확하게 컬럼명을 쓰는게 좋다.

 

평균가격이 높은 순서로 싶을 때 

 

여기서(GROUP BY 결과물내에서)평균가격이 100불 이상인 경우를 조회하고싶다면

SELECT SupplierID

        , CategoryID
        , AVG(Price) AS avg_price

FROM Products

GROUP BY SupplierId, CategoryId

HAVING AVG(Price) >= 100

 

주의 from뒤에 where절에서 조건걸어주면 100불 이상인 경우에서 group by해주기 때문에 결과가 다름

 

문제풀이

해커랭크 Weather Observation Station 4

DISTINCT : 중복된 행 제거

top earners

1. salary  * month = earnings 

2. 각 earning별로 몇 명이 그만큼 벌었는지 계산(5000, 2 / 3000, 5 / 1000, 1) 5000만원번 사람 2명, 3000만원번사람 5명, 1000만원 번 사람 1명 - GROUP BY

3. earings중에 가장 가잔 큰 값을 가져온다 - ORDER BY, LIMIT (내림차순으로 sorting한 다음 limit)

 

 

earnings별 몇 명이 벌었는지 계산

SELECT salary * months AS earnings,

          COUNT(*)

FRAM employee

GROUP BY earnings

 

 earings중에 가장 가장 큰 값을 가져온다

SELECT salary * months AS earnings,

          COUNT(*)

FROM employee

GROUP BY earnings

ORDER BY earnings DESC

LIMIT 1

'Database > MySQL' 카테고리의 다른 글

SELECT  (0) 2021.05.13
UNION, UNION ALL  (0) 2021.05.09
JOIN  (0) 2021.05.09
CASE문  (0) 2021.05.09
집계함수  (0) 2021.04.28