Problema:
Desea encontrar grupos de filas en los que el promedio de valores en una columna sea mayor o menor que un valor dado.
Ejemplo:
Nuestra base de datos tiene una tabla llamada product
con datos en las siguientes columnas:id
, name
, grocery
y price
.
id | nombre | comestibles | precio |
---|---|---|---|
1 | leche | Tienda Verde | 2.34 |
2 | pan | Supermercado de Clark | 3.56 |
3 | pan | Supermercado | 4.15 |
4 | leche | Supermercado | 1,80 |
5 | pan | Supermercado Amanda | 2.26 |
6 | leche | Supermercado Violeta | 3,45 |
7 | leche | Supermercado de Clark | 2.10 |
8 | pan | Supermercado Violeta | 2,55 |
9 | leche | Supermercado Amanda | 1,95 |
Busquemos los nombres de los productos en los que el precio medio de cada producto entre las tiendas de comestibles es superior a 3,00.
Solución:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Aquí está el resultado:
nombre | promedio |
---|---|
pan | 3.13 |
Discusión:
Para filtrar registros mediante la función de agregado, utilice la cláusula HAVING.
Aquí calculamos el valor agregado:el precio medio de cada producto. Uno es vendido por más de un tendero; por lo tanto, el precio promedio se calcula para cada uno (en nuestro ejemplo, SELECT name, AVG(price)
). Además de la función agregada, también usamos el nombre de la columna en SELECT, por lo que deberíamos usar GROUP BY con este nombre de columna (GROUP BY name
).
El último paso es usar la función agregada en la cláusula HAVING. Recuerde que HAVING debe colocarse después de la cláusula GROUP BY. Contiene la condición que compara el valor devuelto por la función agregada con un valor dado. Arriba, es el precio medio del producto con un valor de 3,00 (HAVING AVG(price)>3.00
). En esta consulta, comprobamos si el precio medio de cada producto en todos los supermercados es superior a tres. La consulta mostró solo un producto, pan, con un precio promedio superior a tres.