기록과 정리

데이터 요약 GROUP BY & HAVING 본문

IT/DB

데이터 요약 GROUP BY & HAVING

zepetto 2021. 8. 22. 20:51

이 글은 '[백문이불여일타] 데이터 분석을 위한 중급 SQL' 강의를 참고하였습니다.

https://www.inflearn.com/course/%EB%B0%B1%EB%AC%B8%EC%9D%B4%EB%B6%88%EC%97%AC%EC%9D%BC%ED%83%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B8%B0%EC%B4%88-sql/lecture/29718?tab=note 

 

[백문이불여일타] 데이터 분석을 위한 기초 SQL - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

GROUP BY

Products 테이블

공급자별로 데이터를 보고 싶고, 평균 가격을 가져온다고 하자.

결과

GROUP BY 뒤에는 데이터를 묶고 싶은 요소(그룹의 기준) 및 ID , SELECT에는 집계함수를 사용했다.

 

      SELECT 묶을 요소

                     , 집계함수(컬럼)

          FROM 테이블

 GROUP BY 묶을 요소

 

여기서 그룹의 기준을 추가하고 싶다면 묶을 요소 뒤에 하나를 더 추가하여 쿼리를 만들어보자.

공급자별로 묶고 또 그중에서 카테고리별로 묶어 평균 가격을 가져온다고 하자.

     

      SELECT 묶을 요소

                    , 묶을 요소2

                    , 집계함수(컬럼)

         FROM 테이블

GROUP BY 묶을 요소, 묶을 요소2

 

결과

여러가지 기준으로도 그룹을 묶어 조회가 가능하다. MySQL의 경우, GROUP BY 뒤에 1이나 2에 숫자를 쓸수 있다. 첫번째 컬럼, 두번째 컬럼을 기준을 잡겠다라는 건데 권장사항이 아니다. ( 명확하게 알 수 없기 때문이다. ) GROUP BY 한 결과로도 ORDER BY 를 사용할 수 있다. ORDER BY 는 이때 마지막줄에 위치한다.

 

HAVING

 

만약  공급자별, 카테고리별 기준을 세운 값중 100달러 이상인 데이터를 가져오는건 어떻게 할까?

 

   SELECT SupplierID

                    , CategroyID

                    , AVG(Price)

         FROM Products

      WHERE Price >= 100

GROUP BY SupplierId, CategoryId

 

해당 쿼리는 전체를 조회하여 Group by를 하였기 때문에 틀린 쿼리이다. GROUP BY를 실행하기 전에 Where문을 실행한다.

결과물들 중 100달러 이상은 

 

     SELECT SupplierID

                    , CategoryID

                    , AVG(Price)

         FROM Products

GROUP BY SupplierId, CategoryID

      HAVING AVG(Price) >= 100

 

GROUP BY 를 실행한 이후 , 필터를 걸어 조건을 걸수 있기때문에 다음과 같이 HAVING 절을 사용하면 적절히 데이터를 가져올수 있다.

공급자별 , 카테고리별 그리고 평균값이 100이상인 것들만 조회.