El lenguaje de consulta T-SQL de SQL Server tiene una gran cantidad de opciones de recuperación de datos. Eso incluye la capacidad de consultar una base de datos SQL, así como proporcionar una función de suma, una función de agregación de recuento y agrupar columnas. La cláusula GROUP BY de SQL puede hacer uso de todas estas capacidades. En este artículo, te mostraré cómo se puede usar la cláusula GROUP BY sola o en conjunto con una de las funciones de agregado para realizar cálculos basados en el agrupamiento.
¿Cómo funciona la cláusula GROUP BY de SQL?
La cláusula GROUP BY de SQL se utiliza con la sentencia SELECT para organizar los datos en grupos de datos idénticos. Esta cláusula sigue a la cláusula WHERE en una sentencia SELECT.
Esta cláusula se utiliza más a menudo con funciones de agregado como SUM, COUNT, AVG, MAX o MIN, que te permiten realizar cálculos con datos agrupados. Puedes agrupar los datos por cualquier tipo de columna diferente, incluyendo números como identificadores de producto, fechas o caracteres como descripciones.
La sintaxis básica de GROUP BY es bastante simple:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
Aquí puedes ver la cláusula GROUP BY utilizada con una declaración SELECT básica. La declaración SELECT recupera dos columnas, y la segunda columna utiliza una función de agregación.
El uso de una función de agregación no es técnicamente necesario, pero es un complemento muy común a la cláusula GROUP BY. La agrupación se realizará en los datos contenidos en la primera columna.
Profundicemos y veamos la cláusula GROUP BY en acción.
Usando SQL GROUP BY con una declaración SELECT
Primero, veamos cómo usar la cláusula SQL GROUP BY con una simple declaración SELECT sin agregar una función de agregación. La siguiente lista recupera y agrupa la columna ‘ID de Producto’ de la tabla SalesOrderDetail en la base de datos de ejemplo AdventureWorksLT2019.
USE AdventureWorksLT2019; SELECT ProductID FROM SalesLT.SalesOrderDetail GROUP BY ProductID;
Esto básicamente devuelve una lista de todos los ID de productos que han sido ordenados, como puedes ver en la siguiente figura.

Usando SQL GROUP BY con funciones de agregación
Es más común usar la cláusula GROUP BY de SQL junto con una de las funciones de agregación que puede darte un recuento, total, promedio o resumen de todas las columnas que has agrupado juntas. La siguiente declaración utiliza GROUP BY con la tabla SalesLT.Product de la base de datos AdventureWorksLT2019 para encontrar el número total de productos en cada categoría de productos:
USE AdventureWorksLT2019; SELECT ProductCategoryID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID;
En este ejemplo, la instrucción SELECT devuelve la columna ‘ProductCategoryID’ de la tabla SalesLT.Product, y cuenta el número de productos en cada categoría usando la función de agregación COUNT(*). Aquí, la cláusula GROUP BY agrupa los resultados por ‘ProductCategoryID’ mientras que la función SELECT COUNT calcula el número total de productos en cada categoría de productos. Los resultados de la función COUNT(*) utilizan el alias ‘TotalProducts’.
Los resultados de esta consulta se muestran en la siguiente figura. Esta salida muestra el número total de productos en cada categoría de productos, como se calcula usando la cláusula GROUP BY. La información resumida es devuelta por la función de agregación COUNT(*).

Usando SQL GROUP BY con múltiples columnas
La función GROUP BY de SQL no está limitada a trabajar con una sola columna. También se puede usar con múltiples columnas simultáneamente en la misma consulta.
Echemos un vistazo a un ejemplo de cómo usar la cláusula GROUP BY con dos columnas de la tabla SalesLT.Product en la base de datos AdventureWorksLT2019. La siguiente consulta muestra cómo recuperar el número total de productos para cada categoría de producto y modelo de producto.
USE AdventureWorksLT2019; SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID, ProductModelID;
Aquí, las columnas ‘ProductCategoryID’ y ‘ProductModelID’ se recuperan y estamos utilizando la función de agregado COUNT(*) para contar el número de productos en cada categoría y subcategoría de productos. En este ejemplo, la cláusula GROUP BY agrupa los resultados de las columnas ‘ProductCategoryID’ y ‘ProductModelID’. Esto crea dos grupos distintos basados en las dos columnas diferentes.
Puedes ver los resultados de esta consulta en la siguiente figura. Estos resultados muestran el número total de productos y modelos de productos, y el recuento total se recupera usando el alias de columna TotalProducts.

Usando SQL GROUP BY con la cláusula HAVING
Otro uso común de la cláusula GROUP BY es combinarla con la cláusula HAVING. De hecho, puedes usar la cláusula GROUP BY con la cláusula HAVING para filtrar los resultados de una consulta basándote en las condiciones que la cláusula HAVING aplica a los grupos de datos. La condición puede aplicarse a una columna de tipo de datos regular o a una función de agregado.
Veamos un ejemplo de cómo usar la cláusula GROUP BY en SQL junto con la cláusula HAVING con la base de datos AdventureWorksLT2019. Este ejemplo muestra qué clientes han realizado pedidos en la tabla SalesLT.SalesOrderHeader con un monto total de pedido superior a $2000. Aquí, la cláusula GROUP BY se utiliza para agrupar los pedidos por cliente, y luego la cláusula HAVING filtra a los clientes basándose en el monto total del pedido.
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;
- En esta lista de código, la tabla SalesLT.Customer se une con la tabla SalesLT.SalesOrderHeader en la columna ‘CustomerID’.
- La lista SELECT recupera el ‘CustomerID’, ‘FirstName’, ‘LastName’ y ‘TotalOrderAmount’.
- La cláusula GROUP BY se utiliza para agrupar los resultados por cliente.
- La función de agregado SUM() calcula el monto total del pedido para cada cliente.
- La cláusula HAVING filtra los resultados agrupados para seleccionar solo a los clientes cuyo monto total del pedido es superior a $2000.
Puedes ver los resultados de esta lista de código en la siguiente figura:

Usando SQL GROUP BY con la cláusula ORDER BY
También puedes usar la cláusula GROUP BY de SQL junto con la cláusula ORDER BY para ordenar el conjunto de resultados por una o más columnas. El siguiente ejemplo utiliza la base de datos AdventureWorksLT2019. Para ilustrar el uso de la cláusula ORDER BY con la cláusula GROUP BY, simplemente puedes tomar el código del ejemplo anterior y agregar la cláusula ORDER BY para ordenar los resultados mostrando los montos de pedido más grandes en orden descendente.
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;
Puedes ver los resultados en la siguiente figura. Estos resultados muestran la lista de clientes con pedidos superiores a $2000 en orden descendente, con los clientes que tienen los pedidos más grandes en la parte superior.

Como puedes ver, puedes hacer muchas cosas con la cláusula GROUP BY de SQL. Te mostré cómo se puede usar la cláusula GROUP BY con múltiples columnas, así como cómo se pueden agregar las cláusulas HAVING y ORDER BY para filtrar y ordenar los resultados.
Como siempre, siéntete libre de hacer cualquier pregunta sobre la cláusula GROUP BY de SQL. Y si quieres aprender más sobre SQL Server, no dudes en consultar los artículos anteriores en mi serie SQL Server Essential.
Source:
https://petri.com/sql-group-by/