MySQL
Agrupar por
Buscar..
Sintaxis
- SELECCIONAR expresión1, expresión2, ... expresión_n,
- aggregate_function (expresión)
- DE las tablas
- [DÓNDE condiciones]
- GRUPO POR expresión1, expresión2, ... expresión_n;
Parámetros
Parámetro | DETALLES |
---|---|
expresión1, expresión2, ... expresión_n | Las expresiones que no están encapsuladas dentro de una función agregada y deben incluirse en la cláusula GROUP BY. |
función agregada | Una función como SUM, COUNT, MIN, MAX o AVG. |
mesas | Las tablas de las que desea recuperar registros. Debe haber al menos una tabla en la cláusula FROM. |
Donde las condiciones | Opcional. Las condiciones que deben cumplirse para que los registros sean seleccionados. |
Observaciones
La cláusula MySQL GROUP BY se usa en una declaración SELECT para recopilar datos en varios registros y agrupar los resultados por una o más columnas.
Su comportamiento se rige en parte por el valor de la variable ONLY_FULL_GROUP_BY
. Cuando esto está habilitado, las SELECT
que se agrupan por cualquier columna que no esté en la salida devuelven un error. ( Este es el valor predeterminado de 5.7.5 ). Tanto la configuración como la no configuración de esta variable pueden causar problemas para usuarios ingenuos o usuarios acostumbrados a otros DBMS.
Grupo usando la función SUMA
SELECT product, SUM(quantity) AS "Total quantity"
FROM order_details
GROUP BY product;
Grupo usando la función MIN
Supongamos una tabla de empleados en la que cada fila es un empleado que tiene un name
, un department
y un salary
.
SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;
Esto le diría qué departamento contiene el empleado con el salario más bajo y cuál es ese salario. Encontrar el name
del empleado con el salario más bajo en cada departamento es un problema diferente, más allá del alcance de este Ejemplo. Consulte "groupwise max".
GRUPO UTILIZANDO COUNT FUNCION
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department;
GRUPO POR USO QUE TIENE
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;
Usar GROUP BY ... HAVING
para filtrar registros agregados es análogo a usar SELECT ... WHERE
para filtrar registros individuales.
También podrías decir HAVING Man_Power >= 10
ya que HAVING
entiende "aliases".
Grupo utilizando Group Concat
Group Concat se usa en MySQL para obtener valores concatenados de expresiones con más de un resultado por columna. Es decir, hay muchas filas para volver a seleccionar para una columna como Name(1):Score(*)
Nombre | Puntuación |
---|---|
Adán | A + |
Adán | UNA- |
Adán | segundo |
Adán | C + |
Cuenta | RE- |
Juan | UNA- |
SELECT Name, GROUP_CONCAT(Score ORDER BY Score desc SEPERATOR ' ') AS Grades
FROM Grade
GROUP BY Name
Resultados:
+------+------------+
| Name | Grades |
+------+------------+
| Adam | C+ B A- A+ |
| Bill | D- |
| John | A- |
+------+------------+
GROUP BY con funciones AGREGADAS
Tabla de pedidos
+---------+------------+----------+-------+--------+
| orderid | customerid | customer | total | items |
+---------+------------+----------+-------+--------+
| 1 | 1 | Bob | 1300 | 10 |
| 2 | 3 | Fred | 500 | 2 |
| 3 | 5 | Tess | 2500 | 8 |
| 4 | 1 | Bob | 300 | 6 |
| 5 | 2 | Carly | 800 | 3 |
| 6 | 2 | Carly | 1000 | 12 |
| 7 | 3 | Fred | 100 | 1 |
| 8 | 5 | Tess | 11500 | 50 |
| 9 | 4 | Jenny | 200 | 2 |
| 10 | 1 | Bob | 500 | 15 |
+---------+------------+----------+-------+--------+
- CONTAR
Devuelve el número de filas que satisfacen un criterio específico en la cláusula WHERE
.
Ej .: Número de pedidos para cada cliente.
SELECT customer, COUNT(*) as orders
FROM orders
GROUP BY customer
ORDER BY customer
Resultado:
+----------+--------+
| customer | orders |
+----------+--------+
| Bob | 3 |
| Carly | 2 |
| Fred | 2 |
| Jenny | 1 |
| Tess | 2 |
+----------+--------+
- SUMA
Devuelve la suma de la columna seleccionada.
Ej .: Suma del total y artículos para cada cliente.
SELECT customer, SUM(total) as sum_total, SUM(items) as sum_items
FROM orders
GROUP BY customer
ORDER BY customer
Resultado:
+----------+-----------+-----------+
| customer | sum_total | sum_items |
+----------+-----------+-----------+
| Bob | 2100 | 31 |
| Carly | 1800 | 15 |
| Fred | 600 | 3 |
| Jenny | 200 | 2 |
| Tess | 14000 | 58 |
+----------+-----------+-----------+
- AVG
Devuelve el valor promedio de una columna de valor numérico.
Ej .: Valor medio del pedido para cada cliente.
SELECT customer, AVG(total) as avg_total
FROM orders
GROUP BY customer
ORDER BY customer
Resultado:
+----------+-----------+
| customer | avg_total |
+----------+-----------+
| Bob | 700 |
| Carly | 900 |
| Fred | 300 |
| Jenny | 200 |
| Tess | 7000 |
+----------+-----------+
- MAX
Devuelve el valor más alto de una determinada columna o expresión.
Por ejemplo: el mayor total de pedidos para cada cliente.
SELECT customer, MAX(total) as max_total
FROM orders
GROUP BY customer
ORDER BY customer
Resultado:
+----------+-----------+
| customer | max_total |
+----------+-----------+
| Bob | 1300 |
| Carly | 1000 |
| Fred | 500 |
| Jenny | 200 |
| Tess | 11500 |
+----------+-----------+
- MIN
Devuelve el valor más bajo de una determinada columna o expresión.
Ej .: El pedido más bajo para cada cliente.
SELECT customer, MIN(total) as min_total
FROM orders
GROUP BY customer
ORDER BY customer
Resultado:
+----------+-----------+
| customer | min_total |
+----------+-----------+
| Bob | 300 |
| Carly | 800 |
| Fred | 100 |
| Jenny | 200 |
| Tess | 2500 |
+----------+-----------+