27th Jul 2023 Lectura de 10 minutos Cómo utilizar COUNT() con GROUP BY: 5 Ejemplos Prácticos Radu Gheorghiu SQL agrupar por Índice Cómo Usar COUNT() y GROUP BY Cuándo utilizar GROUP BY Cuándo utilizar la función COUNT() 5 Ejemplos de uso de COUNT() con GROUP BY Ejemplo #1: Agrupar por una sola columna Ejemplo 2: Agrupar por varias columnas Ejemplo 3: Uso de WHERE con COUNT() y GROUP BY Ejemplo nº 4: Uso de ORDER BY con COUNT() y GROUP BY Ejemplo #5: COUNT(expresión) COUNT(*) - Contar filas Recuento de valores NO NULL en una columna Contar valores distintos NO NULOS en una columna ¿Quiere saber más sobre COUNT() y GROUP BY? 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: En primer lugar, la base de datos explora la tabla orders y lee todas las filas. 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". 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. 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. 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. Tags: SQL agrupar por