Precaución al usar la función SUM()

3 comentarios

A veces puede parecer que se obtendrá el mismo resultado escribiendo un SELECT que tiene una función SUM() de una forma o de otra, pero lo que se obtiene no es lo esperado. Veamos un ejemplo:

SUMA1

Captura 1. Si haces clic en la imagen la verás más grande

Listado 1.

SELECT
   SUM(MOV_PRECIO) / SUM(MOV_CANTID) AS RESULTADO
FROM
   MOVIMDET

SUMA2

Captura 2. Si haces clic en la imagen la verás más grande

Listado 2.

SELECT
   SUM(MOV_PRECIO / MOV_CANTID) AS RESULTADO
FROM
   MOVIMDET

SUMA3

Captura 3. Si haces clic en la imagen la verás más grande

¿Por qué no se obtiene el mismo resultado? ¿Acaso ambos resultados no deberían ser idénticos?

Pues no, en el Listado 1. se le pide que sume todos los valores de la columna MOV_PRECIO y los divida por la suma de todos los valores de la columna MOV_CANTID

Suma de MOV_PRECIO = 200

Suma de MOV_CANTID = 2

Al dividir ambas sumas el resultado es 100

Sin embargo, en el Listado 2. para cada fila primero se halla el resultado de la división y luego se realiza la suma.

100 / 1 = 100

100 / 1 = 100

Al sumar ambos resultados se obtiene 200

El motivo por el cual se obtienen resultados diferentes es que en el Listado 1. se suman todas las filas de una sola vez, en cambio en el Listado 2. se suman de una en una.

Cuidado con esto, si no entiendes bien este concepto podrías estar obteniendo resultados incorrectos.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

Anuncios

Un poco más sobre la función AVG()

1 comentario

La función AVG() nos devuelve el promedio de una columna numérica. O sea que halla la suma de esa columna y luego la divide por la cantidad de filas que no sean NULL, es decir que si en una fila hay NULL no la utiliza en el cálculo.

Para entender mejor a la función AVG() consideremos una tabla que tiene 7 filas, las cuales en una columna numérica tienen estos valores:

20
40
10
20
NULL
NULL
NULL

Ejemplo 1:

El promedio según la función AVG() es:

SELECT
   AVG(MiColumna)
FROM
   MiTabla

90 / 4 = 22,5

Se dividió por 4 y no por 7, porque las filas con NULL para la función AVG() son inexistentes.

Ejemplo 2:

En la misma tabla anterior queremos hallar el promedio de esa columna pero esta vez considerando a las filas que tienen NULL, en ese caso deberíamos escribir:

SELECT
   SUM(MiColumna) / COUNT(*)
FROM
   MiTabla

90 / 7 = 12,8571

Ejemplo 3:

Si lo que nos interesa es hallar el promedio considerando solamente los valores distintos entonces escribiríamos:

SELECT
   AVG(DISTINCT MiColumna)
FROM
   MiTabla

70 / 3 = 23,3333

Hay 3 valores distintos (20, 40, 10) porque uno de ellos (20) está repetido y por lo tanto no se lo usa ni en la suma ni en la cantidad de filas. La suma de los valores distintos (20 + 40 + 10) es 70 y la cantidad de valores distintos es 3, por lo tanto el promedio es 70 / 3 = 23,3333

Artículos relacionados:

La función AVG()

El índice del blog Firebird21

 

Usos de la función COUNT()

1 comentario

Como seguramente ya sabes, la función COUNT() sirve para … contar.

Sin embargo, quizás no sepas que se la puede emplear de diversas maneras, como veremos en los siguientes ejemplos:

Ejemplo 1. Contar todas las filas de una tabla

SELECT
   COUNT(*)
FROM
   MiTabla

Ejemplo 2. Contar las filas que cumplen una condición

SELECT
   COUNT(*)
FROM
   MiTabla
WHERE
   MiCondición

Ejemplo 3. Contar la cantidad de filas que tienen NULL

SELECT
   COUNT(*)
FROM
   MiTabla
WHERE
   MiColumna IS NULL

Ejemplo 4. Contar la cantidad de filas que no tienen NULL

SELECT
   COUNT(*)
FROM
   MiTabla
WHERE
   MiColumna IS NOT NULL

 Ejemplo 5. Contar las filas que no tienen NULL en una columna

SELECT
   COUNT(MiColumna)
FROM
   MiTabla

Ejemplo 6. Contar las filas sin los duplicados

SELECT
   COUNT(DISTINCT MiColumna)
FROM
   MiTabla

 Ejemplo 7. Contar las filas de otra tabla

SELECT
   (SELECT COUNT(*) FROM MiOtrTabla)
FROM
   RDB$DATABASE

Ejemplo 8. Hallar el promedio considerando las filas que tienen NULL

SELECT
   SUM(MiColumna) / COUNT(*)
FROM
   MiTabla

La función AVG() halla el promedio pero ignora a las filas que tienen NULL, si queremos hallar el promedio considerando a las filas que tienen NULL como si tuvieran cero, esta es la forma.

 Artículos relacionados:

La función COUNT()

El índice del blog Firebird21