SQL Server 2014: 실습10 GROUP BY, HAVING 집계 함수 등

뇌를 자극하는 SQL Server 2012 기본편 217페이지

–GROUP BY–

그룹으로 묶어주는 역할

clip_image001

USE sqlDB;
SELECT userID, amount FROM buyTbl ORDER BY userID;

사용자별로 여러 번의 물건 구매가 이루어져 합계를 보고 싶어졌다.

clip_image002

SELECT userID, sum(amount) FROM buyTbl GROUP BY userID;

구매한 개수를 SUM()함수로 합친 뒤 출력. 집계 함수는 주로 GROUP BY와 함께 사용됨.

clip_image003

SELECT userID AS [사용자 아이디], sum(amount) AS [총 구매 개수] FROM buyTbl GROUP BY userID;

별칭을 사용해 보기 좋게 만들기

clip_image004

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

가격*수량으로 총 구매액 계산함.

–집계 함수–

함수명

설명

AVG()

평균

MIN()

최소값

MAX()

최대값

COUNT()

행의 개수

COUNT_BING()

개수(, 결과값이 bigint )

STDEV()

표준편차

VAR()

분산

clip_image005

SELECT AVG(amount) AS [평균구매개수] FROM buyTbl;

전체 구매자가 구매한 물품의 개수의 평균. 사실은 2.9166개인데 int값으로 나옴

clip_image006

SELECT AVG(amount*1.0) AS [평균구매개수] FROM buyTbl;

1.0을 곱하거나…

clip_image007

SELECT AVG(CAST(amount AS DECIMAL(10,6))) AS [평균구매개수] FROM buyTbl;

CAST() 함수로 제대로 보여줄 수도 있음.

clip_image008

SELECT userID, AVG(amount*1.0) AS [평균구매개수] FROM buyTbl GROUP BY userID;

사용자별로 물건을 평균 몇 번 구매했는지 구함

clip_image009

SELECT name, height FROM userTbl
WHERE height = (SELECT MAX(height) FROM userTbl)
OR height = (SELECT MIN(height) FROM userTbl);

키가 가장 작은 사람과 큰 사람을 출력

clip_image010

SELECT COUNT(*) FROM userTbl;

전체 회원 10명 출력

clip_image011

SELECT COUNT(mobile1) AS [휴대폰이 있는 사용자] FROM userTbl;

휴대폰이 있는 사용자만 카운트

clip_image012

메시지 탭을 열어보면 Null 값이 제거되었다고 알려줌.

–COUNT()와 SELECT의 결과 비교–

clip_image013

위와 같이 SQL Server Profiler 실행

clip_image014

USE AdventureWorks;
GO
SELECT * FROM Sales.Customer;
GO
SELECT COUNT(*) FROM Sales.Customer;
GO

위 구문 실행.

clip_image015

COUNT(*)과 SELECT *의 Duration 차이가 크다.

–Having절–

clip_image016

SELECT userID AS [사용자], SUM(price*amount) AS [총구매액]
FROM buyTbl GROUP BY userID;

사용자별 총 구매액

clip_image017

SELECT userID AS [사용자], SUM(price*amount) AS [총구매액]
FROM buyTbl WHERE SUM(price*amount) > 1000 GROUP BY userID;

총 구매액이 1000이상인 사용자만 찾으려고 하니… 집계 함수가 WHERE 절에 나타날 수가 없다고 한다.

clip_image018

SELECT userID AS [사용자], SUM(price*amount) AS [총구매액]
FROM buyTbl GROUP BY userID HAVING SUM(price*amount) > 1000;

HAVING 절은 GROUP BY 다음에 나와야 한다.

clip_image019

SELECT userID AS [사용자], SUM(price*amount) AS [총구매액]
FROM buyTbl GROUP BY userID HAVING SUM(price*amount) > 1000
ORDER BY SUM(price*amount);

총구매액이 적은 사용자부터 출력하기 위해 ORDER BY 절 사용

–ROLLUP절–

clip_image020

SELECT num, groupName, SUM(price*amount) AS [비용]FROM buyTbl GROUP BY ROLLUP (groupName, num);

총합 또는 중간 합계가 필요하다면… ROLLUP을 사용.(맨 아래에는 총합계가 나옴)

clip_image021

SELECT groupName, SUM(price*amount) AS [비용]FROM buyTbl GROUP BY ROLLUP (groupName);

소합계 및 총합계만 필요하면 name을 빼면 됨.

clip_image022

SELECT groupName, SUM(price*amount) AS [비용],
GROUPING_ID(groupName) AS [추가행여부]FROM buyTbl GROUP BY ROLLUP (groupName);

GROUPING_ID가 1이면 합계를 위해 추가된 열이라고 보면 됨.

–CUBE 함수–

clip_image023

위와 같은 테이블을 만듦.

clip_image024

SELECT prodName, color, SUM(amount) AS [수량합계]FROM CUBETEST1
GROUP BY CUBE (color, prodName);
GROUP BY CUBE를 사용해 물품별, 색상별 소합계를 모두 볼 수 잇음.

77은 모니터 소합계, 33은 컴퓨터 소합계, 110은 총합계, 검정과 파랑의 44, 66은 색상별 소합계가 출력됨.

이것도 살펴보세요!

Vue3: 리액티브 시스템

ref()의 동작 ref() 함수의 동작을 배우려면 리액티브시스템을 이해할 필요가 있다. 리액티브란 변수의 값의 변화에 연동해서 …

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다