수색…


소개

SELECT 쿼리의 결과는 GROUP BY 문을 사용하여 하나 이상의 열로 그룹화 할 수 있습니다. 그룹화 된 열의 값이 같은 모든 결과가 함께 집계됩니다. 이렇게하면 하나의 결과 대신 부분 결과 테이블이 생성됩니다. GROUP BY는 HAVING 문을 사용하여 집계 함수와 함께 사용하여 그룹화되지 않은 열을 집계하는 방법을 정의 할 수 있습니다.

통사론

  • GROUP BY {
    열 표현
    | ROLLUP (<group_by_expression> [, ... n])
    | CUBE (<group_by_expression> [, ... n])
    | GROUPING SETS ([, ... n])
    | () - 총계를 계산합니다.
    } [, ... n]

  • <group_by_expression> :: =
    열 표현
    | (열 표현식 [, ... n])

  • <grouping_set> :: =
    () - 총계를 계산합니다.
    | <grouping_set_item>
    | (<grouping_set_item> [, ... n])

  • <grouping_set_item> :: =
    <group_by_expression>
    | ROLLUP (<group_by_expression> [, ... n])
    | CUBE (<group_by_expression> [, ... n])

GROUP BY를 사용하여 주어진 열의 각 고유 항목에 대한 행 수를 계산하십시오.

열의 주어진 값에 대한 개수 또는 부분합을 생성하려고한다고 가정 해 봅시다.

이 테이블이 주어지면, "Westerosians":

이름 GreatHouseAllegience
아리아 뚜렷한
코제시 란니 스터
Myrcella 란니 스터
야라 그레이 조이
Catelyn 뚜렷한
산사 뚜렷한

GROUP BY가 없으면 COUNT는 단순히 총 행 수를 반환합니다.

SELECT Count(*) Number_of_Westerosians
FROM Westerosians

보고...

웨스 토시아 인 수
6

그러나 GROUP BY를 추가하면 특정 열의 각 값에 대해 사용자를 COUNT 할 수 있으며 주어진 Great House의 사용자 수를 반환 할 수 있습니다.

SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience

보고...

웨스 토시아 인 수
뚜렷한
그레이 조이 1
란니 스터 2

GROUP BY와 ORDER BY를 결합하여 결과를 최대 또는 최소 카테고리별로 정렬하는 것이 일반적입니다.

SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc

보고...

웨스 토시아 인 수
뚜렷한
란니 스터 2
그레이 조이 1

HAVING 절을 사용하여 GROUP BY 결과 필터링

HAVING 절은 GROUP BY 표현식의 결과를 필터링합니다. 주 : 다음 예제는 라이브러리 예제 데이터베이스를 사용합니다.

예 :

두 개 이상의 책을 저술 한 모든 저자를 반환합니다 ( 실제 예 ).

SELECT
  a.Id,
  a.Name,
  COUNT(*) BooksWritten
FROM BooksAuthors ba
  INNER JOIN Authors a ON a.id = ba.authorid
GROUP BY
  a.Id,
  a.Name
HAVING COUNT(*) > 1    -- equals to HAVING BooksWritten > 1
;

3 명 이상의 저자가있는 모든 책을 반환합니다 ( ).

SELECT
  b.Id,
  b.Title,
  COUNT(*) NumberOfAuthors
FROM BooksAuthors ba
  INNER JOIN Books b ON b.id = ba.bookid
GROUP BY
  b.Id,
  b.Title
HAVING COUNT(*) > 3    -- equals to HAVING NumberOfAuthors > 3
;

기본 GROUP BY 예제

설명을 위해 GROUP BY를 "for each"라고 생각하면 쉬울 수도 있습니다. 아래 쿼리 :

SELECT EmpID, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

말하는거야 :

"EmpID 마다 MonthlySalary의 합계를주세요"

그래서 테이블이 이렇게 보였다면 :

+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1    |200          |
+-----+-------------+
|2    |300          |
+-----+-------------+

결과:

+-+---+
|1|200|
+-+---+
|2|300|
+-+---+

합계는 하나의 숫자가 그 숫자이기 때문에 아무 것도하지 않는 것으로 보입니다. 다른 한편으로는 이렇게 보인 경우에 :

+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1    |200          |
+-----+-------------+
|1    |300          |
+-----+-------------+
|2    |300          |
+-----+-------------+

결과:

+-+---+
|1|500|
+-+---+
|2|300|
+-+---+

그렇다면 두 개의 EmpID 1이 함께 합쳐지기 때문입니다.

ROLAP 집계 (데이터 마이닝)

기술

SQL 표준은 두 개의 추가 집계 연산자를 제공합니다. 이들은 다형성 값 "ALL"을 사용하여 속성이 취할 수있는 모든 값의 집합을 나타냅니다. 두 연산자는 다음과 같습니다.

  • with data cube 는 절의 인수 속성보다 가능한 모든 조합을 제공합니다.
  • with roll up 왼쪽에서 오른쪽으로 순서대로 속성을 고려하여 얻은 집합을 제공합니다.

이러한 기능을 지원하는 SQL 표준 버전 : 1999,2003,2006,2008,2011.

예제들

다음 표를 고려하십시오.

식품 상표 총 _ 금액
파스타 브랜드 1 100
파스타 브랜드 2 250
피자 브랜드 2 300 자

큐브와 함께

select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
식품 상표 총 _ 금액
파스타 브랜드 1 100
파스타 브랜드 2 250
파스타 모든 350
피자 브랜드 2 300 자
피자 모든 300 자
모든 브랜드 1 100
모든 브랜드 2 550
모든 모든 650

롤업으로

select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
식품 상표 총 _ 금액
파스타 브랜드 1 100
파스타 브랜드 2 250
피자 브랜드 2 300 자
파스타 모든 350
피자 모든 300 자
모든 모든 650


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