Microsoft SQL Server
GROUP BY
수색…
간단한 그룹화
주문 표
고객 ID | 제품 ID | 수량 | 가격 |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 삼 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 개 |
삼 | 5 | 6 | 700 |
특정 열을 기준으로 그룹화 할 때이 열의 고유 한 값만 반환됩니다.
SELECT customerId
FROM orders
GROUP BY customerId;
반환 값 :
고객 ID |
---|
1 |
2 |
삼 |
count()
와 같은 집계 함수는 전체 테이블이 아닌 각 그룹에 적용됩니다.
SELECT customerId,
COUNT(productId) as numberOfProducts,
sum(price) as totalPrice
FROM orders
GROUP BY customerId;
반환 값 :
고객 ID | numberOfProducts | 총 가격 |
---|---|---|
1 | 삼 | 800 |
2 | 1 | 50 개 |
삼 | 1 | 700 |
여러 열로 된 GROUP
하나는 하나 이상의 컬럼으로 GROUP BY 할 수 있습니다.
declare @temp table(age int, name varchar(15))
insert into @temp
select 18, 'matt' union all
select 21, 'matt' union all
select 21, 'matt' union all
select 18, 'luke' union all
select 18, 'luke' union all
select 21, 'luke' union all
select 18, 'luke' union all
select 21, 'luke'
SELECT Age, Name, count(1) count
FROM @temp
GROUP BY Age, Name
나이와 이름으로 그룹화하여 다음을 생성합니다.
나이 | 이름 | 카운트 |
---|---|---|
18 | 루크 | 삼 |
21 | 루크 | 2 |
18 | 매트 | 1 |
21 | 매트 | 2 |
여러 테이블, 여러 열로 그룹화
Group by는 join 문과 함께 사용됩니다. 두 개의 테이블이 있다고 가정 해 봅시다. 첫 번째는 학생들의 테이블입니다.
신분증 | 성명 | 나이 |
---|---|---|
1 | 매트 존스 | 20 |
2 | 프랭크 블루 | 21 |
삼 | 안소니 엔젤 | 18 |
두 번째 테이블은 각 학생이 수강 할 수있는 과목 목록입니다.
Subject_Id | 제목 |
---|---|
1 | 수학 |
2 | 체육 |
삼 | 물리학 |
그리고 한 학생이 많은 과목에 다 참석할 수 있고 한 과목에 많은 학생들이 참여할 수 있으므로 (따라서 N : N 관계) 세 번째 "경계"표가 있어야합니다. Student_subjects 테이블을 호출 해 봅시다 :
Subject_Id | 학생 아이디 |
---|---|
1 | 1 |
2 | 2 |
2 | 1 |
삼 | 2 |
1 | 삼 |
1 | 1 |
이제 각 학생이 참석하는 과목의 수를 알고 싶다고합시다. 여기서 단일 테이블을 통해 정보를 사용할 수 없으므로 독립형 GROUP BY
문으로 충분하지 않습니다. 따라서 JOIN
문과 함께 GROUP BY
를 사용해야합니다.
Select Students.FullName, COUNT(Subject Id) as SubjectNumber FROM Students_Subjects
LEFT JOIN Students
ON Students_Subjects.Student_id = Students.Id
GROUP BY Students.FullName
주어진 쿼리의 결과는 다음과 같습니다.
FullName | SubjectNumber |
---|---|
매트 존스 | 삼 |
프랭크 블루 | 2 |
안소니 엔젤 | 1 |
GROUP BY 사용법의보다 복잡한 예를 보려면 학생이 동일한 제목을 한 번 이상 (예 : students_Subjects 표에 표시된 것처럼) 할당 할 수 있다고 가정 해 봅시다. 이 시나리오에서는 하나 이상의 열에 의해 GROUPING하여 각 과목이 학생에게 배정 된 횟수를 세어 볼 수 있습니다 :
SELECT Students.FullName, Subjects.Subject,
COUNT(Students_subjects.Subject_id) AS NumberOfOrders
FROM ((Students_Subjects
INNER JOIN Students
ON Students_Subjcets.Student_id=Students.Id)
INNER JOIN Subjects
ON Students_Subjects.Subject_id=Subjects.Subject_id)
GROUP BY Fullname,Subject
이 쿼리는 다음 결과를 제공합니다.
FullName | 제목 | SubjectNumber |
---|---|---|
매트 존스 | 수학 | 2 |
매트 존스 | 체육 | 1 |
프랭크 블루 | 체육 | 1 |
프랭크 블루 | 물리학 | 1 |
안소니 엔젤 | 수학 | 1 |
지키는
WHERE
절은 GROUP BY
보다 먼저 평가되기 때문에 WHERE
를 사용하여 그룹화 결과를 요약 할 수 없습니다 (일반적으로 COUNT(*)
와 같은 집계 함수). 이 필요를 충족시키기 위해 HAVING
절을 사용할 수 있습니다.
예를 들어 다음 데이터를 사용합니다.
DECLARE @orders TABLE(OrderID INT, Name NVARCHAR(100))
INSERT INTO @orders VALUES
( 1, 'Matt' ),
( 2, 'John' ),
( 3, 'Matt' ),
( 4, 'Luke' ),
( 5, 'John' ),
( 6, 'Luke' ),
( 7, 'John' ),
( 8, 'John' ),
( 9, 'Luke' ),
( 10, 'John' ),
( 11, 'Luke' )
각 사람이 주문한 주문 수를 얻고 싶으면
SELECT Name, COUNT(*) AS 'Orders'
FROM @orders
GROUP BY Name
그리고 얻다
이름 | 명령 |
---|---|
매트 | 2 |
남자 | 5 |
루크 | 4 |
그러나 두 개 이상의 주문을 한 개인에게만 이것을 적용하려면 HAVING
절을 추가 할 수 있습니다.
SELECT Name, COUNT(*) AS 'Orders'
FROM @orders
GROUP BY Name
HAVING COUNT(*) > 2
산출 할 것이다
이름 | 명령 |
---|---|
남자 | 5 |
루크 | 4 |
GROUP BY
와 마찬가지로 HAVING
있는 열은 SELECT
문에서 해당 열과 정확히 일치해야합니다. 위의 예에서 우리가 대신 말한 경우
SELECT Name, COUNT(DISTINCT OrderID)
우리 HAVING
절은
HAVING COUNT(DISTINCT OrderID) > 2
ROLLUP 및 CUBE가있는 GROUP BY
ROLLUP 연산자는 부분합과 합계가 포함 된 보고서를 생성하는 데 유용합니다.
CUBE는 선택한 열의 값 조합에 대한 집계를 보여주는 결과 집합을 생성합니다.
ROLLUP은 선택한 열의 값 계층 구조에 대한 집계를 보여주는 결과 세트를 생성합니다.
목 색깔 수량 표 푸른 124 표 빨간 223 의자 푸른 101 의자 빨간 210
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item Color QtySum
-------------------- -------------------- --------------------------
Chair Blue 101.00
Chair Red 210.00
Chair ALL 311.00
Table Blue 124.00
Table Red 223.00
Table ALL 347.00
ALL ALL 658.00
(7 행 영향)
쿼리의 ROLLUP 키워드가 CUBE로 변경되면이 두 개의 추가 행이 마지막에 반환된다는 점을 제외하고는 CUBE 결과 집합이 동일합니다.
ALL Blue 225.00
ALL Red 433.00
https://technet.microsoft.com/en-us/library/ms189305(v=sql.90).aspx