수색…
소개
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 |