Não sei se há como definir uma nova função agregada, não sem mexer no código fonte do MySQL.
Mas se todos os seus números forem positivos, você pode derivar da identidade aritmética:
log( product( Ai ) ) = sum( log( Ai ) )
que você pode usar EXP(SUM(LOG(x)))
para calcular PRODUCT(x)
. Teste no SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Quando os dados podem ter 0s, fica um pouco mais 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 ;
Testado no SQL-Fiddle
Para outros DBMS, que não têm a conversão automática do MySQL de valores booleanos em números inteiros, o
(NOT EXISTS (SELECT ...))
deve ser substituído por:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
Especificamente para a Oracle, serão necessárias mais algumas alterações, sem alterar a lógica da resposta, apenas porque a Oracle não segue o padrão ANSI estrito em algumas áreas. Testado no SQL-Fiddle-2