수색…


간단한 그룹화

주문 표

고객 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



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow