Anuncios en tutorial de programación PLSQL

miércoles, 15 de mayo de 2019

La función SQL PRODUCT o PROD, como simularla

Todo el mundo que programe en SQL y PL/SQL ha tenido alguna vez la necesidad de utilizar la función SUM(nombre_campo) dentro de una sentencia SELECT, función que suma el valor de todos los registros nombre_campo que devuelve la función SELECT al ser ejecutada. No obstante, si en vez de la suma queremos obtener el producto, ¿existe una función PRODUCT(nombre_campo) equivalente a SUM en SQL?


Teóricamente debería existir, como existe por ejemplo en Excel o en Matlab (en este caso con el nombre de PROD), pero lo cierto es que en SQL no existen las funciones PRODUCT ni PROD. Entonces, ¿qué hacer si tenemos que calcular el producto de un determinado campo para diferentes registros de una tabla?

Seguro que alguno habrá pensado, muy sencillo, escribo un cursor que se recorra todos los registros que quiero multiplicar y voy acumulando el producto de todos ellos. Es la primera solución en la que cualquiera puede pensar, pero existe una solución mucho más sencilla... ¿por qué no aprovechar aquella propiedad de los logaritmos que decía: "El logaritmo de un producto es lo mismo que la suma de los logaritmos"?
LN(a*b*c) = LN(a) + LN (b) + LN(c)

Ciertamente, utilizando esta propiedad podemos simular la función PRODUCT, veamos como:
PRODUCT(nombre_campo) = EXP(SUM(LN(nombre_campo)))

Afortunadamente las funciones LN (que calcula el logaritmo neperiano de un número) y su función inversa EXP (que calcula e elevado a un número determinado) sí que existen en SQL y PLSQL.

Pero para demostrar que funciona no hay nada mejor que utilizar un ejemplo sencillo:
SELECT EXP(SUM(LN(Num)))
FROM (SELECT 2 Num FROM DUAL
      UNION
      SELECT 3 Num FROM DUAL
      UNION
      SELECT 4 Num FROM DUAL
      UNION
      SELECT 5 Num FROM DUAL) 

¿No es cierto que el resultado da 120? Es decir, el resultado de multiplicar 2*3*4*5.

Espero que el post os haya resultado útil.

2 comentarios:

Jacqueline Gil Tapia-Ruano dijo...

sencillamente genial :)

Àlex Prior dijo...

y como se haría para simular la division?