SQL

GROUP BY 및 HAVING 그리고 집계 함수

Jundol 2016. 5. 19. 16:44

1. GROUP BY

말 그대로 그룹으로 묶어주는 역할을 한다.
한 테이블에서 사용자(userid)가 구매한 물품의 개수(amount)를 보려면 각각의 행이 출력된다.

하지만 해당 사용자가 총 구매한 물품의 개수로 묶어서 출력해 보이고 싶다면 sum 함수를 사용하면 된다.

1
SELECT userid, SUM(amount) FROM buyTbl GROUP BY userid
cs

이렇게 되면 열 이름 없음으로 나오는데 이럴때는 별칭(alias)를 사용해서 결과를 보기 편하도록 한다.

1
SELECT userid AS [사용자 아이디], SUM(amount) AS [총 구매 개수] FROM buyTbl GROUP BY userid
cs

구매액의 총 합을 출력해 본다. 구매액은 가격 * 개수이므로 총 합은 SUM()을 사용한다.

1
SELECT userid AS [사용자 아이디], SUM(amount * price) AS [총 구매 액] FROM buyTbl GROUP BY userid
cs


2. 집계함수

함수명 

설명 

AVG() 

평균 

MIN() 

최소값 

MAX() 

최대값 

COUNT() 

행의 개수 

COUNT_BIG() 

행의 개수. 단, 결과값이 bigint형 

STDEV() 

표준편차 



3. HAVING

위의 구매액의 총 합을 구하는 쿼리문에서 총 구매액이 1000 이상인 사용자만 출력하려고 한다.

그러면 보통 지금까지 학습했을 경우 WHERE절을 이용해서 출력하려고 할 것이다.

1
2
3
4
SELECT userid as [사용자], SUM(price * amount) as [총 구매액]
FROM buyTbl
WHERE SUM(price * amount) > 1000
GROUP BY userid
cs

위와같이 오류가 발생한다.

이럴 때 사용하는게 HAVING 이다. HAVING은 WHERE와 비슷한 개념으로 조건을 제한하는 것으로 집계 함수에 대해서 조건을 거는 것이라고 생각하면 된다. 그리고 HAVING 절은 꼭 GROUP BY 절 다음에 나와야 한다!!

1
2
3
4
SELECT userid as [사용자], SUM(price * amount) as [총 구매액]
FROM buyTbl
GROUP BY userid
HAVING SUM(price*amount) > 1000
cs