Articles

SQLShack

Posted on

En este artículo, aprenderemos la función SQL Average que se conoce como función AVG() en T-SQL. La función AVG() es una función agregada que calcula el valor medio de un conjunto de datos numéricos que devuelve la sentencia SELECT.

Introducción

Supongamos que tenemos una colección de números. En primer lugar, sumamos todos los miembros de la colección y luego dividimos el número total de miembros de la colección. Como resultado, el número obtenido será la media. Vamos a explicar esta noción matemática con un ejemplo sencillo.

Juan es un estudiante de la universidad y decide registrar sus gastos cada día. El siguiente gráfico y tabla representan los gastos de la última semana de Juan.

Cálculo de la media en matemáticas

Cálculo de la media en matemáticas

Ahora, calcularemos el gasto medio de la última semana de Juan. En un primer momento, sumaremos todos los gastos de la citada semana.

($20+$60+$20+$42+$10+$15+$8) = $175 es el importe total de los gastos de la semana.

En el segundo paso, dividiremos el importe total de los gastos entre 7 porque esta colección se forma sobre 7 miembros. En otras palabras, una semana está formada por siete días.

175 dólares / 7 = 25 dólares es el gasto medio de la semana.

Después de discutir el concepto matemático de la media, vamos a seguir aprendiendo los fundamentos de la función AVG() en SQL.

Preparación de los datos

Con la ayuda de la siguiente consulta, crearemos la tabla WeekExpense y luego insertaremos los gastos de 3 semanas de Juan. Utilizaremos esta tabla en todos los ejemplos de este artículo.

1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

CREATE TABLE WeekExpense
( WeekNumber VARCHAR(20),WeekDayName VARCHAR(50), Expense MONEY)
INSERT INTO WeekExpense
VALORES
(‘Week05′,’Monday’, 20 ),
( ‘Week05′,’Tuesday’, 60 ),
( ‘Semana05′,’Miércoles’, 20 ),
( ‘Semana05′,’Jueves’, 42 ),
( ‘Semana05′,’Viernes’, 10 ),
( ‘Semana05′,’Sábado’, 15 ) ,
(‘Semana05′,’Domingo’, 8 ),
(‘Semana04′,’Lunes’, 29 ),
(‘Semana04′,’Martes’, 17 ),
(‘Semana04′,’Miércoles’, 42 ),
(‘Semana04′,’Jueves’, 11 ),
(‘Semana04′,’Viernes’, 43 ),
(‘Semana04′,’Sábado’, 10 ) ,
(‘Semana04′,’Domingo’, 15 ),
(‘Semana03′,’Lunes’, 10 ),
(‘Semana03′,’Martes’, 32 ),
(‘Semana03′,’Miércoles’, 35 ),
(‘Semana03′,’Jueves’, 19 ),
( ‘Semana03′,’Viernes’, 30 ),
( ‘Semana03′,’Sábado’, 10 ) ,
( ‘Semana03′,’Domingo’, 15 )
GO
SELECT *
FROM WeekExpense

Tabla WeekExpense resultset

WeekExpense table resultset

Sintaxis de la función de Promedio SQL

La función de sintaxis AVG() tendrá el siguiente aspecto en su forma simple:

1
2
3

SELECT AVG ( columname )
FROM TABLENAME
WHERE CONDITION

La palabra clave ALL nos permite calcular una media para todos los valores del conjunto de resultados y se utiliza por defecto. La palabra clave DISTINCT implementa la función AVG() sólo para valores únicos.

Ejemplo de función AVG()

La siguiente consulta calculará el gasto medio de Juan con la ayuda de la función AVG().

1
2
3

SELECT AVG(Expense) AS
FROM WeekExpense
WHERE WeekNumber = ‘Week05’

Un ejemplo sencillo de la función AVG()

Un ejemplo sencillo de la función AVG()

La siguiente imagen ilustra la metodología de cálculo de la función AVG() mediante su uso por defecto.

Ilustración de la función de promedio SQL

Ilustración de la función de promedio SQL

Como podemos ver, AVG() considera todos los días de la semana y los fines de semana en su cálculo. Además, podemos obtener el mismo resultado cuando añadimos la palabra clave ALL a la sintaxis.

1
2
3

SELECT AVG(ALL Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Un ejemplo sencillo de la función AVG() con la palabra clave ALL

Un ejemplo sencillo de la función AVG() con la palabra clave ALL

Si queremos ignorar los valores duplicados durante el cálculo de la función AVG(), podemos utilizar la palabra clave DISTINCT. Después de ejecutar la consulta de abajo, analicemos el resultado:

1
2
3

SELECT AVG(DISTINCT Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Un ejemplo sencillo de la función AVG() con la palabra clave DISTINCT

.

Un ejemplo sencillo de la función AVG() con la palabra clave DISTINCT

La palabra clave DISTINCT elimina los valores duplicados, por lo tanto, sólo tiene en cuenta uno de los gastos cuyos valores son $20 en el cálculo. La siguiente imagen ilustra básicamente el mecanismo de funcionamiento de la palabra clave DISTINCT.

Ilustración de la función de promedio SQL con la palabra clave DISTINCT

Ilustración de la función de promedio SQL con la palabra clave DISTINCT

Función de promedio SQL y valores NULL

La función AVG() no considera los valores NULL durante su cálculo. Ahora, estudiaremos un ejemplo de este problema. Al principio, actualizaremos los gastos del domingo como NULL en la tabla WeekExpense.

1
2
3
4
5

UPDATE WeekExpense
SET
Expense = NULL
WHERE WeekDayName = ‘Sunday’ AND
WeekNumber = ‘Week05’

Ahora, ejecutaremos la siguiente consulta para calcular el valor medio.

1
2
3

SELECT AVG(Expense) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

AVG() resultado de ejemplo de la función

Resultado de ejemplo de la función AVG()

Como podemos ver, el valor NULL no fue tenido en cuenta por la función AVG() en el cálculo. La siguiente imagen ilustra el método de cálculo:

Ilustración de la función promedio SQL y la interacción de las expresiones NULL

Ilustración de la función promedio SQL y la interacción de las expresiones NULL

Si queremos incluir los valores NULL en el cálculo, podemos utilizar la función ISNULL. La función ISNULL se utiliza para cambiar los valores NULL en los valores definidos. Así que ejecutaremos lo siguiente para incluir las expresiones NULL en el cálculo.

1
2
3

SELECT AVG(ISNULL(Expense,0)) AS
FROM WeekExpense
WHERE WeekNumber =’Week05′

Uso de la función AVG() con ISNULL

Uso de la función AVG() con ISNULL

La siguiente imagen ilustra el método de cálculo de la consulta anterior:

Cómo eliminar los valores NULL en la función media de SQL

Cómo eliminar los valores NULL en la función media de SQL

En este punto, debemos remarcar aquí es que incluimos la expresión NULL al cálculo como 0.

Uso de la función Promedio SQL con la sentencia GROUP BY

La sentencia GROUP BY se utiliza para agrupar los datos y se usa principalmente con las funciones de agregación.

Juan decidió calcular el gasto medio de todas las semanas. Para manejar el problema de John, necesitamos usar la sentencia GROUP BY y la función AVG() al mismo tiempo. La siguiente consulta calculará el gasto medio por cada semana individual.

1
2
3
4

SELECT WeekNumber, AVG(Expense) AS
FROM WeekExpense
GROUP BY WeekNumber
ORDER BY WeekNumber DESC

AVG() con la función GROUP BY

Uso de la función AVG() con la función GROUP BY

Cuando hemos echado un vistazo al conjunto de resultados de la consulta, podemos ver que los promedios se calcularon para todas las semanas por separado.

Consejo de bonificación: Detalles del plan de ejecución de la función Promedio SQL

El plan de ejecución ayuda a entender los detalles de ejecución de una consulta. Cuando analizamos el plan de ejecución de una consulta, obviamente podemos entender lo que ocurre entre bastidores.

Ahora, analizaremos el siguiente plan de ejecución real de la consulta con ApexSQL Plan para que podamos entender claramente lo que ocurre entre bastidores de la función AVG().

1
2

SELECT AVG(Expense) AS
FROM WeekExpense

El plan de ejecución visual de la consulta se muestra a continuación:

Plan de ejecución de la función AVG()

El escaneo de la tabla leyó todas las filas de las tablas porque no creamos ningún índice en esta tabla. En el siguiente paso, el operador Stream aggregate computa la suma y el valor de conteo de las expresiones.

Operador Stream aggregate

Compute scalar toma estas expresiones de Stream aggregate y calcula el valor promedio a través de la siguiente fórmula.

1
2
3
4
5

CASE
WHEN = (0)
THEN NULL
ELSE / CONVERT_IMPLICIT(money, , 0)
END

Computa el operador escalar

En esta fórmula, debemos remarcar un punto. Cuando el número total de las expresiones devuelva 0, el cálculo del promedio devolverá NULL. Si el número total de expresiones devuelve 0, el valor del promedio será NULL. La intención principal de esto es evitar el error de dividir por cero.

Conclusión

En este artículo, hemos aprendido la función Promedio de SQL y hemos reforzado nuestro aprendizaje con ejemplos e ilustraciones básicas. En el camino, discutimos los detalles del plan de ejecución de la función AVG().

  • Autor
  • Puestos recientes
Esat Erkec
Esat Erkec es un profesional de SQL Server que comenzó su carrera hace más de 8 años como desarrollador de software. Es un experto en soluciones certificadas de SQL Server.
La mayor parte de su carrera se ha centrado en la administración y el desarrollo de bases de datos de SQL Server. Sus intereses actuales se centran en la administración de bases de datos y Business Intelligence. Puedes encontrarlo en LinkedIn.
Ver todos los posts de Esat Erkec
Esat Erkec
Los últimos posts de Esat Erkec (ver todos)
  • Mitos de la optimización de consultas – 23 de marzo, 2021
  • Síntomas de la detección de parámetros en SQL Server – 17 de marzo de 2021
  • Utilización de la corrección automática del plan para el ajuste de consultas – 4 de marzo de 2021

.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *