SQL GROUP BY 절 사용하는 SQL Server Essentials

SQL Server의 T-SQL 쿼리 언어에는 다양한 데이터 검색 옵션이 있습니다. SQL 데이터베이스를 쿼리하고 합계 함수, 카운트 집계 함수, 그리고 열을 그룹화하는 능력을 제공하는 것도 그 중 하나입니다. SQL GROUP BY 절은 이러한 기능을 모두 활용할 수 있습니다. 이 기사에서는 GROUP BY 절을 단독으로 또는 집계 함수 중 하나와 함께 사용하여 그룹화된 데이터를 기반으로 계산하는 방법을 보여드리겠습니다.

SQL GROUP BY 절은 어떻게 작동합니까?

SQL GROUP BY 절은 SELECT 문과 함께 사용되어 동일한 데이터를 그룹으로 정렬합니다. 이 절은 SELECT 문의 WHERE 절 다음에 나옵니다.  

광고

이 절은 주로 SUM, COUNT, AVG, MAX 또는 MIN과 같은 집계 함수와 함께 사용되며, 그룹화된 데이터로 계산을 수행할 수 있습니다. 제품 ID, 날짜 또는 설명과 같은 다양한 열 유형으로 데이터를 그룹화할 수 있습니다.

기본 GROUP BY 구문은 매우 간단합니다:

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;

여기에서 기본적인 SELECT 문과 함께 사용된 GROUP BY 절을 볼 수 있습니다. SELECT 문은 두 개의 열을 검색하고, 두 번째 열은 집계 함수를 사용합니다.

집계 함수의 사용은 기술적으로 필수는 아니지만, GROUP BY 절의 매우 흔한 보완입니다. 그룹화는 첫 번째 열에 포함된 데이터를 기준으로 수행됩니다.

광고

더 깊이 파고들어 GROUP BY 절이 어떻게 작용하는지 살펴보겠습니다.

SELECT 문과 함께 SQL GROUP BY 사용하기

먼저, 집계 함수를 추가하지 않고 간단한 SELECT 문과 함께 SQL GROUP BY 절을 사용하는 것을 살펴봅시다. 다음 목록은 AdventureWorksLT2019 샘플 데이터베이스의 SalesLT.SalesOrderDetail 테이블에서 ‘제품 ID’ 열을 검색하고 그룹화합니다.

USE AdventureWorksLT2019;

SELECT ProductID FROM SalesLT.SalesOrderDetail
  GROUP BY ProductID;

이는 사실상 주문된 모든 제품 ID 목록을 반환하는데, 아래 그림에서 확인할 수 있습니다.

We get a list of all of the ProductIDs that have been ordered (Image credit: Petri/Michael Otey)

집계 함수와 함께 SQL GROUP BY 사용하기

SQL GROUP BY 절은 그룹화된 열의 총 수, 합계, 평균 또는 요약을 제공할 수 있는 집계 함수 중 하나와 함께 사용하는 것이 더 일반적입니다. 다음 문은 AdventureWorksLT2019 데이터베이스의 SalesLT.Product 테이블과 함께 GROUP BY를 사용하여 각 제품 카테고리의 총 제품 수를 찾습니다:

광고

USE AdventureWorksLT2019;

SELECT ProductCategoryID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
   GROUP BY ProductCategoryID;

이 예에서 SELECT 문은 SalesLT.Product 테이블의 ‘ProductCategoryID’ 열을 반환하고 COUNT(*) 집계 함수를 사용하여 각 카테고리의 제품 수를 계산합니다. 여기서 GROUP BY 절은 ‘ProductCategoryID’로 결과를 그룹화하고 SELECT COUNT 함수는 각 제품 카테고리의 총 제품 수를 계산합니다. COUNT(*) 함수의 결과는 ‘TotalProducts’ 별칭을 사용합니다.

이 쿼리의 결과는 다음 그림에 표시됩니다. 이 출력은 GROUP BY 절을 사용하여 각 제품 카테고리의 총 제품 수를 보여줍니다. 요약 정보는 COUNT(*) 집계 함수에 의해 반환됩니다.

Using SQL GROUP BY with aggregate functions (Image credit: Petri/Michael Otey)

여러 열로 SQL GROUP BY 사용하기

SQL GROUP BY 함수는 단일 열과 동시에 동일한 쿼리에서 여러 열과 함께 사용할 수 있습니다.

SalesLT.Product 테이블에서 AdventureWorksLT2019 데이터베이스의 두 열을 사용하여 GROUP BY 절을 사용하는 예를 살펴보겠습니다. 다음 쿼리는 각 제품 범주와 제품 모델별 제품 총 수를 검색하는 방법을 보여줍니다.

USE AdventureWorksLT2019;

SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
  GROUP BY ProductCategoryID, ProductModelID;

여기서 ‘ProductCategoryID’와 ‘ProductModelID’ 열을 모두 검색하고 COUNT(*) 집계 함수를 사용하여 각 제품 범주와 하위 범주의 제품 수를 계산합니다. 이 예에서 GROUP BY 절은 ‘ProductCategoryID’와 ‘ProductModelID’ 열의 결과를 그룹화합니다. 이렇게 하면 두 가지 다른 열을 기반으로 두 가지 다른 그룹이 생성됩니다.

이 쿼리의 결과를 다음 그림에서 확인할 수 있습니다. 이 결과는 제품 및 제품 모델의 총 수를 보여주며 총 수는 TotalProducts 열 별칭을 사용하여 검색됩니다.

Using SQL GROUP BY with multiple columns (Image credit: Petri/Michael Otey)

HAVING 절과 함께 SQL GROUP BY 사용하기

GROUP BY 절의 또 다른 일반적인 사용 방법은 HAVING 절과 결합하는 것입니다. 실제로 GROUP BY 절을 HAVING 절과 결합하여 쿼리의 결과를 HAVING 절이 데이터 그룹에 적용하는 조건에 따라 필터링할 수 있습니다. 조건은 일반 데이터 유형 열이나 집계 함수에 적용할 수 있습니다.

어드벤처웍스LT2019 데이터베이스와 SQL GROUP BY 절 및 HAVING 절을 사용하는 예를 살펴보겠습니다. 이 예에서는 SalesLT.SalesOrderHeader 테이블에서 총 주문 금액이 $2000를 초과하는 주문을 한 고객을 보여줍니다. 여기서 GROUP BY 절은 고객별로 주문을 그룹화하고 HAVING 절은 총 주문 금액을 기준으로 고객을 필터링합니다.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
 JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
 HAVING SUM(soh.TotalDue) > 2000;
  • 이 코드 목록에서 SalesLT.Customer 테이블은 ‘CustomerID’ 열을 기반으로 SalesLT.SalesOrderHeader 테이블과 조인됩니다.
  • SELECT 목록은 ‘CustomerID’, ‘FirstName’, ‘LastName’ 및 ‘TotalOrderAmount’를 검색합니다.
  • GROUP BY 절은 결과를 고객별로 그룹화합니다.
  • SUM() 집계 함수는 각 고객의 총 주문 금액을 계산합니다.
  • HAVING 절은 총 주문 금액이 $2000를 초과하는 고객만 선택하도록 그룹화된 결과를 필터링합니다.

다음 그림에서 이 코드 목록의 결과를 볼 수 있습니다.

Using SQL GROUP BY with the HAVING clause (Image credit: Petri/Michael Otey)

SQL GROUP BY와 ORDER BY 절 사용

당신은 SQL GROUP BY 절을 사용하여 결과 집합을 하나 이상의 열로 정렬할 수도 있습니다. 다음 예제는 AdventureWorksLT2019 데이터베이스를 사용합니다. GROUP BY 절과 함께 ORDER BY 절을 사용하여 결과를 정렬하는 예제를 살펴보겠습니다. 이전 예제 코드를 가져와 ORDER BY 절을 추가하여 결과를 내림차순으로 표시합니다.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
   JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
   HAVING SUM(soh.TotalDue) > 2000
   ORDER BY TotalOrderAmount DESC;

다음 그림에서 결과를 확인할 수 있습니다. 이 결과는 내림차순으로 2000달러 이상의 주문을 한 고객 목록을 표시하며, 가장 큰 주문을 한 고객이 맨 위에 표시됩니다.

Using SQL GROUP BY with the ORDER BY clause (Image credit: Petri/Michael Otey)

보시다시피, SQL GROUP BY 절로 많은 작업을 수행할 수 있습니다. GROUP BY 절을 여러 열과 함께 사용하는 방법과 HAVING 및 ORDER BY 절을 추가하여 결과를 필터링하고 정렬하는 방법을 보여드렸습니다.

계속해서 SQL GROUP BY 절에 관한 질문이 있으면 언제든지 질문해 주세요. 그리고 SQL Server에 대해 더 많이 알고 싶다면 제 SQL Server Essential series의 이전 기사를 확인해 주세요.

Source:
https://petri.com/sql-group-by/