본문 바로가기

개발/DB

[mssql] GROUP BY / HAVING 사용법

반응형

GROUP BY

- 그룹별로 묶어주는 역할을 한다.

- 집계함수에 사용되는 컬럼은 GROUP BY절에 없더라도 사용가능하다.

- 집계함수에 사용되지 않는 컬럼은 GROUP BY 절과 SELECT 절에 함께 써줘야 한다. 



PersonType별로 묶어보자


묶어준 PersonType별로 ID 수를 알고 싶을 때 -- 집계함수 사용 (count)


** 집계 함수 **

AVG() 평균 

MIN() 최소값 

MAX() 최대값

COUNT() 행의 개수 

STDEV() 표준편차 

VAR() 분산 

SUM() 합계 


** 주의사항 ** 

GROUP BY 없이 별도의 열을 집계 함수와 같이 사용할 수 없다. 


가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력 하고 싶다면 ?  아래와 같이 작성 시 오류가 나온다. 

1
SELECT name, MIN(height) , MAX(height) FROM user -- 불가능 
cs

최저 키와  최대 키는 1개씩 인데 name은 여러개임으로 GROUP BY없이 사용할 수 없다.


집계함수와 열을 함께 사용할 시에는 열을 GROUP BY로 묶어서 사용해야 한다. 


name을 GROUP BY 로 묶어 줄 시 , GROUP 별 최저 키와 최대 키를 알 수 있다. 

(name으로 묶어 줬기 때문에 중복되는 이름 이 없다면 각각 이름에 해당하는 키가 나올 것이다. )  

(중복되는 이름이 있다면 그 이름의 최소 키와 최대키가 보여질 것임)  

1
SELECT name, MIN(height) , MAX(height) FROM user GROUP BY NAME ; --가능
cs


이렬경우 서브쿼리를 이용해 아래와 같이 작성하자.

1
2
SELECT name, height FROM user
WHERE height = (SELECT MAX(height) FROM user) OR height = (SELECT MIN(height) FROM user);
cs




Having

- 집계함수의 조건을 제한하는 것이다. 

- WHERE절은 집계함수를 사용 할 수 없다. 

- GROUP BY절과 함께 사용되며 GROUP BY 절 다음에 사용된다. 


총구매액이 1000 이상인 사용자의 이름과 구매액을 구하여라.

1
2
3
4
SELECT name, SUM(price)
FROM buy
GROUP BY name
HAVING SUM(price) > 1000
cs


반응형