Volver a la lista de artículos Artículos
Lectura de 10 minutos

Cómo utilizar COUNT() con GROUP BY: 5 Ejemplos Prácticos

El uso de la función COUNT() con GROUP BY es una de las construcciones SQL más comunes en las consultas agregadas. Lea este artículo para averiguar cómo utilizar COUNT() con GROUP BY correctamente mediante 5 ejemplos.

En este artículo, explicaremos la importancia de utilizar COUNT con GROUP BY. Hablaremos de por qué es esencial en SQL y cómo permite analizar y resumir datos basándose en criterios específicos. Esta combinación permite a los usuarios extraer información significativa, calcular recuentos y generar resúmenes estadísticos a partir de grandes conjuntos de datos.

Si busca una revisión en profundidad de conceptos básicos de SQL como COUNT() y GROUP BY, le recomiendo nuestro curso interactivo SQL para principiantes interactivo. Contiene 129 ejercicios que le ayudarán a repasar todos los conceptos clave de SQL.

Cómo Usar COUNT() y GROUP BY

Si estás aquí sólo por la respuesta rápida, aquí está el TLDR:

La forma correcta de usar COUNT() con GROUP BY se muestra en la consulta de abajo:

SELECT 
  Store,
  COUNT(*) as NumberOfSales, 
FROM Sales
GROUP BY Store;

Desglosemos el resultado para entender cómo funciona esta consulta. Las filas con el mismo valor en la columna Store se agrupan. Imagine una tabla intermedia en la que estas filas están agrupadas y marcadas con colores diferentes, como en la imagen siguiente. Esta sería nuestra tabla intermedia que contiene sólo la columna Store, ya que es la columna que forma parte de nuestra sentencia SELECT.

StoreProductIDCustomerID
Store A1657
Store A11116
Store A14525
Store B1369
Store B11138
Store C13616
Store C1118

A continuación, la base de datos cuenta lógicamente el número de filas de cada grupo mediante la función COUNT(*). Este recuento representa el número de pedidos de cada tienda.

Una vez contadas las filas, no hay necesidad de tener filas duplicadas con el mismo valor de Tienda. Así, GROUP BY reducirá el número de filas a sólo valores únicos. En otras palabras, se deshará de las filas individuales y nos dará un resumen de cada grupo. Terminamos con el siguiente resultado:

StoreNumberOfSales
Store A3
Store B2
Store C2

Cuándo utilizar GROUP BY

GROUP BY es una cláusula SQL que agrupa filas basándose en uno o más valores de columna. A menudo se utiliza en combinación con funciones agregadas como COUNT(), SUM(), AVG(), MAX(), y MIN() para realizar cálculos sobre datos agrupados.

La cláusula GROUP BY es útil cuando se desea:

  • Realizar cálculos y agregaciones sobre subconjuntos de datos.
  • Generar estadísticas de resumen y métricas para diferentes grupos o categorías.
  • Identificar patrones y tendencias dentro de grupos específicos.
  • Generar informes y analizar datos basados en diferentes dimensiones o atributos.
  • Aplicar filtros y condiciones sobre datos agrupados, utilizando la función HAVING

En resumen, GROUP BY se utiliza para organizar y resumir datos basándose en columnas, funciones o expresiones específicas, lo que le permitirá obtener información y realizar cálculos sobre distintos grupos dentro de un conjunto de datos.

Cuándo utilizar la función COUNT()

COUNT() es una de las funciones agregadas más comunes de SQL. Devuelve el número de filas que cumplen una condición especificada o que están incluidas en un conjunto de resultados. Suele utilizarse para recuperar el número total de registros de una tabla o para calcular el número de apariciones de un valor concreto en una columna.

5 Ejemplos de uso de COUNT() con GROUP BY

Ahora que hemos repasado los escenarios básicos en los que se utilizan COUNT() y GROUP BY, repasemos algunos de los ejemplos más complicados. Comenzaremos con ejemplos más simples y seguiremos con escenarios más complejos.

Ejemplo #1: Agrupar por una sola columna

El escenario más simple que puede encontrar es cuando necesita agrupar por una sola columna. En el siguiente ejemplo, necesitamos encontrar como el conteo de empleados de nuestra compañía es distribuido a través de diferentes títulos de trabajo.

Antes de ver la solución SQL para este escenario, repasemos los datos de ejemplo. Se trata de la tabla employees tabla:

EmployeeIDFirstNameLastNameJobTitle
1JohnDoeManager
2JaneSmithSupervisor
3MarkJohnsonDeveloper
4EmilyWilliamsAnalyst
5MichaelBrownDesigner
6SarahDavisDeveloper
7RobertWilsonDesigner
8JessicaTaylorDeveloper

Utilizando la función COUNT con GROUP BY en la columna JobTitle, podemos obtener un desglose del número de empleados en cada función específica. Puede ver la consulta y el resultado (basado en los datos de muestra) a continuación:

SELECT 
  JobTitle, 
  COUNT(*) AS NumberOfEmployees
FROM employees
GROUP BY JobTitle;
JobTitleNumberOfEmployees
Analyst1
Designer2
Developer3
Manager1
Supervisor1

Este ejemplo funciona de la misma manera que nuestra consulta inicial. GROUP BY pone las filas de los empleados con el mismo cargo en un grupo. A continuación, la función COUNT() cuenta las filas de cada grupo. GROUP BY contrae las filas de cada grupo, manteniendo sólo el valor de la columna JobTitle y el recuento.

Ejemplo 2: Agrupar por varias columnas

Por supuesto, puede agrupar filas por más de una columna.

En este ejemplo, veremos una tabla de ejemplo orders que contiene información básica sobre pedidos:

OrderIDCustomerIDProductIDProductCategoryOrderDateStatusAmount
11011001Electronics2023-05-01Completed150.00
21021002Clothing2023-05-02Completed80.00
31011001Home Goods2023-06-03In progress60.00
4103NULLAccessories2023-06-03Canceled200.00
51011002Electronics2023-07-04NULL120.00
61021001NULL2023-07-05NULLNULL
71031002Clothing2023-07-06In progress90.00
81021002Accessories2023-08-07NULL75.00
9103NULLNULL2023-08-08NULL100.00
101011001Home Goods2023-09-09NULLNULL
111021001Home Goods2023-06-05In progress80.00
121031004Accessories2023-06-06Completed75.00
131021005Electronics2023-08-06Completed88.00

Necesitamos escribir una consulta que muestre el número de pedidos realizados por cada cliente y el ProductCategory de ese pedido. Esto significa que tendremos que devolver el CustomerID y la categoría a la que pertenece el pedido.

La consulta tendrá el siguiente aspecto:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
GROUP BY CustomerID, ProductCategory;

Y el resultado de ejecutar esta consulta se puede ver a continuación:

CustomerIDProductCategoryNumberOfOrders
101Electronics2
101Home Goods2
102Electronics2
102Accessories2
102Clothing1
103Accessories2
103Clothing1
103NULL1

Nuestra consulta agrupa las filas por dos columnas: CustomerID y ProductCategory. Esto significa que GROUP BY agrupa las filas con los mismos valores de CustomerID y ProductCategory en un solo grupo. (Las filas de CustomerID 101 y la categoría Electronics están en un grupo, pero las filas de CustomerID 101 y la categoría Home Goods están en un grupo diferente). A continuación, las filas de cada grupo se cuentan por COUNT().

Ejemplo 3: Uso de WHERE con COUNT() y GROUP BY

Nuestro ejemplo anterior analizaba un escenario en el que queríamos crear un agregado de toda la información de nuestra tabla. orders tabla. Sin embargo, en ocasiones, es posible que deseemos segmentar esta información y ver sólo los pedidos de las categorías seleccionadas.

Utilizando los mismos datos de ejemplo que teníamos antes, ahora escribiremos una consulta que muestre la misma información para los pedidos que entran dentro de "Accesorios" o "Ropa" ProductCategory.

Para ello, podemos utilizar la consulta del Ejemplo 2 y simplemente añadir una cláusula WHERE. Esta cláusula filtrará los registros en los que ProductCategory sea igual a "Accesorios" o "Ropa".

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Clothing’)
GROUP BY CustomerID, ProductCategory;
CustomerIDProductCategoryNumberOfOrders
102Accessories2
103Accessories1
102Clothing1
103Clothing1

Si no resulta del todo intuitivo cómo la base de datos ha generado los resultados utilizando la consulta anterior, a continuación se explica paso a paso lo que ha ocurrido entre bastidores:

  1. En primer lugar, la base de datos explora la tabla orders y lee todas las filas.
  2. A continuación, aplica la condición de filtrado en WHERE ProductCategory IN (‘Accessories’, ‘Clothing’ ) para filtrar las filas. Después de este paso, sólo se procesan las filas en las que la categoría del producto es "Accesorios" o "Ropa".
  3. A continuación, las filas filtradas se agrupan en función de los valores de las columnas CustomerID y ProductCategory, que se especifican en la cláusula GROUP BY.
  4. Para cada una de las combinaciones únicas de CustomerID y ProductCategory, se aplica la función COUNT(*). Esto contará el número de filas dentro de cada grupo.
  5. El conjunto de resultados final incluye CustomerID, ProductCategory y el recuento de pedidos (mostrado en la columna NumberOfOrders ) para cada grupo.

En resumen, la base de datos filtrará las filas que respeten la condición de filtrado especificada. A continuación, las agrupará según las columnas especificadas en la cláusula GROUP BY, y luego calculará el recuento de pedidos dentro de cada uno de esos grupos. El resultado final incluirá CustomerID, ProductCategory y el correspondiente recuento de pedidos para cada combinación única de CustomerID y ProductCategory.

Ejemplo nº 4: Uso de ORDER BY con COUNT() y GROUP BY

Observando el resultado del ejemplo número 4, podemos ver que algunas de las filas de la salida están mezcladas. Esto se debe a que las columnas de la lista GROUP BY generalmente requerirán - pero no garantizan - ordenar la salida basándose en la lista de columnas de la sección GROUP BY.

Pero si, por ejemplo, necesitamos organizar los resultados en función de diferentes condiciones (por ejemplo, una línea de tiempo o por fecha) necesitaremos utilizar una cláusula ORDER BY:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Electronics’)
GROUP BY CustomerID, ProductCategory
ORDER BY ProductCategory, CustomerID;
CustomerIDProductCategoryNumberOfOrdes
101Accessories2
102Accessories2
102Electronics1
103Electronics2

Hemos añadido la cláusula ORDER BY con la lista de columnas por las que queremos ordenar los datos. Como puede ver, esto ordena la información de salida basándose en el orden de las columnas listadas.

Ejemplo #5: COUNT(expresión)

Hasta ahora, hemos visto ejemplos sencillos de cómo trabajar con COUNT(); el propósito era contar todas las filas del conjunto de datos o tabla de origen.

Sin embargo, existen formas más complejas de utilizar la combinación COUNT–GROUP BY. Para explicarlo, crearemos un nuevo conjunto de datos de ejemplo.

Tenemos una tabla llamada SurveyResponses que almacena las respuestas a una encuesta. Algunas de las preguntas son opcionales, por lo que hay algunos encuestados con valores de respuesta NULOS; se han saltado las preguntas opcionales. Puede ver los datos de ejemplo a continuación:

ResponseIDRespondentIDRespondentNameQuestionIDAnswer
1101John1Agree
2101John2No
3101John3Yes
4102Sarah1Yes
5102Sarah2Not Sure
6102Sarah3NULL
7103Mark1No
8103Mark2Maybe
9103Mark3No
10104Emily1Yes
11104Emily2Not Sure
12104Emily3Disagree

COUNT(*) - Contar filas

El uso más común de la función COUNT (y su funcionalidad por defecto, incluso si se utiliza con GROUP BY) es contar el número de filas. Por ejemplo, si queremos contar los tipos de respuesta de las preguntas de una encuesta, podemos utilizar la siguiente consulta:

SELECT COUNT(*) AS NumberOfYesAnswers, Answer
FROM SurveyResponses
GROUP BY Answer;

El resultado será el siguiente

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
1NULL

El resultado es un recuento de todas las filas que coinciden con una determinada respuesta. Devuelve el número agregado de respuestas de la encuesta y el tipo de respuesta.

Recuento de valores NO NULL en una columna

Veamos otro ejemplo que podría parecer que genera los mismos resultados. En realidad, este ejemplo tiene algo particular e importante; en lugar de utilizar * como parámetro en nuestra función COUNT(), estamos utilizando COUNT() con un nombre de columna.

Vamos a modificar la consulta del ejemplo anterior. En lugar del parámetro * para la función COUNT(), lo sustituiremos por la columna Answer. Nuestra nueva consulta tendrá el siguiente aspecto:

SELECT 
  COUNT(Answer) AS NumberOfAnswers, 
  AnswerFROM SurveyResponses
GROUP BY Answer;

Si ejecutamos esta nueva consulta, veremos que los resultados devueltos son casi exactamente los mismos:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
0NULL

Podemos ver que la salida para el valor de respuesta NULL ha cambiado de 1 a 0. Esto se debe a que la función COUNT() sólo tiene en cuenta los valores que no sonNULL cuando realiza la agregación.

Antes hacíamos COUNT(*), que implícitamente significa contar las filas; COUNT(Answer) contará los valores de la columna Answer. Y como teníamos 1 valor con NULL, omitirá esos valores en su cálculo - devolviendo 0 en este segundo escenario.

Contar valores distintos NO NULOS en una columna

En esta tercera variación del uso de la función COUNT, utilizaremos la misma consulta que en nuestro ejemplo anterior. Esta vez, sin embargo, añadiremos la palabra clave DISTINCT antes del nombre de la columna.

SELECT 
  Answer, 
  COUNT(DISTINCT Answer) AS DistinctCount
FROM SurveyResponses
GROUP BY Answer;
StatusDistinctCount
Yes1
No1
Not Sure1
Agree1
Disagree1
Maybe1
NULL0

Podemos ver en la salida anterior que el resultado de esta consulta ha convertido todos los valores positivos de la columna DistinctCount en 1. Añadir la palabra clave DISTINCT significa que cada vez que la función COUNT encuentre un nuevo valor que no haya visto antes, añadirá ese estado a su lista y añadirá un 1 a su recuento. Sin embargo, si encuentra el mismo valor de estado por segunda vez o más, omitirá contarlo.

¿Quiere saber más sobre COUNT() y GROUP BY?

El uso de COUNT() con GROUP BY es sólo una de las muchas funciones potentes que ofrece SQL. Si desea explorar SQL más a fondo y dominar realmente sus capacidades, le animo a que consulte nuestro completo curso SQL para principiantes . Si buscas prácticas de SQL, te recomiendo nuestro Ejercicio de SQL que cuenta con más de 600 ejercicios prácticos de SQL.

Después de tomar nuestros cursos, quizás sientas que quieres encontrar un trabajo trabajando con SQL. Para ayudarte a preparar tu entrevista, tenemos una lista de preguntas de entrevista SQL que te mostrará algunos ejemplos reales de preguntas y problemas en SQL.