Je ne sais pas s'il existe un moyen de définir une nouvelle fonction d'agrégation, non sans jouer avec le code source de MySQL.
Mais si vos chiffres sont tous positifs, vous pouvez très bien dériver de l'identité arithmétique:
log( product( Ai ) ) = sum( log( Ai ) )
que vous pouvez utiliser EXP(SUM(LOG(x)))pour calculer PRODUCT(x). Test dans SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Lorsque les données peuvent avoir des 0, cela devient un peu plus compliqué:
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 ;
Testé chez SQL-Fiddle
Pour les autres SGBD, qui n'ont pas la conversion automatique de MySQL des valeurs booléennes en entiers, le
(NOT EXISTS (SELECT ...))
devrait être remplacé par:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
Spécifiquement pour Oracle, quelques modifications supplémentaires seront nécessaires, sans changer la logique de la réponse, uniquement parce qu'Oracle ne suit pas la norme ANSI stricte dans certains domaines. Testé à SQL-Fiddle-2