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.

1 comentario: