Mostrando entradas con la etiqueta select sum. Mostrar todas las entradas
Mostrando entradas con la etiqueta select sum. Mostrar todas las entradas

martes, 25 de marzo de 2014

La Diferencia Entre sum(col1)+sum(col2) y sum(col1+col2)

Probé este ejemplo en Oracle 11.2 para mostrar porque sum(col1)+sum(col2) y sum(col1+col2) puedan producir resultados diferentes. Para empezar, creé una tabla y añadí unos datos:

SQL> create table empleado
  2  (nombre varchar2(10),
  3   sueldo number,
  4   comision number)
  5  /

Tabla creada.

SQL> insert into empleado values ('Andrew',10,5)
  2  /

1 fila creada.

SQL> insert into empleado values ('Brian',10,null)
  2  /

1 fila creada.

SQL> insert into empleado values ('Colin',null,5)
  2  /

1 fila creada.

SQL>

Luego ejecuté dos comandos de SQL y vi que los resultados eran diferentes:

SQL> select sum(sueldo) + sum(comision) from empleado
  2  /

SUM(SUELDO)+SUM(COMISION)
-------------------------
                       30

SQL> select sum(sueldo + comision) from empleado
  2  /

SUM(SUELDO+COMISION)
--------------------
                  15

SQL>

Entonces miré los datos que había añadido: 

SQL> select * from empleado
  2  /

NOMBRE         SUELDO   COMISION
---------- ---------- ----------
Andrew             10          5
Brian              10
Colin                          5

SQL>

Verifiqué sum(sueldo). Esta cifra cuenta los valores pero ignora los nulos:

SQL> select sum(sueldo) from empleado
  2  /

SUM(SUELDO)
-----------
         20

SQL>

La misma cosa pasa con sum(comision):

SQL> select sum(comision) from empleado
  2  /

SUM(COMISION)
-------------
           10

SQL>

Pero si se suman sueldo y comisión en cada fila, el resultado es nulo si sueldo sea nulo. También es nulo si comisión sea nulo:

SQL> select nombre, (sueldo + comision) "Pago Total"
  2  from empleado
  3  /

NOMBRE     Pago Total
---------- ----------
Andrew             15
Brian
Colin

SQL>

Esto es porque, si se añaden un número y un nulo, el resultado es un nulo: 

SQL> l
  1  select nvl(to_char(10+null),'10 + null es nulo')
  2* from dual
SQL> /
 
NVL(TO_CHAR(10+NU
-----------------
10 + null es nulo
 
SQL> 

Por eso, los dos comandos producen resultados diferentes cuando la tabla contiene nulos.