No sé si hay forma de definir una nueva función agregada, no sin jugar con el código fuente de MySQL.
Pero si todos sus números son positivos, bien puede derivar de la identidad aritmética:
log( product( Ai ) ) = sum( log( Ai ) )
que puedes usar EXP(SUM(LOG(x)))
para calcular PRODUCT(x)
. Prueba en SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Cuando los datos pueden tener ceros, se vuelve un poco más complicado:
SELECT (NOT EXISTS (SELECT 1 FROM t WHERE a = 0))
* EXP(SUM(LOG(a))) AS p
FROM t
WHERE a > 0 ;
SELECT d.col,
(NOT EXISTS (SELECT 1 FROM t AS ti WHERE ti.col = d.col AND ti.a = 0))
* COALESCE(EXP(SUM(LOG(t.a))),1) AS p
FROM
( SELECT DISTINCT col
FROM t
) AS d
LEFT JOIN
t ON t.col = d.col
AND t.a > 0
GROUP BY d.col ;
Probado en SQL-Fiddle
Para otros DBMS, que no tienen la conversión automática de valores booleanos a enteros de MySQL, el
(NOT EXISTS (SELECT ...))
debe reemplazarse con:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
Específicamente para Oracle, se necesitarán algunos cambios más, sin cambiar la lógica de la respuesta, solo porque Oracle no sigue el estricto estándar ANSI en algunas áreas. Probado en SQL-Fiddle-2