Я не знаю, есть ли способ определить новую агрегатную функцию, не без возни с исходным кодом MySQL.
Но если все ваши числа положительны, вы можете получить арифметическую идентичность:
log( product( Ai ) ) = sum( log( Ai ) )
что вы можете использовать EXP(SUM(LOG(x)))
для расчета PRODUCT(x)
. Тест в SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Когда данные могут иметь 0, это становится немного сложнее:
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 ;
Проверено на SQL-Fiddle
Для других СУБД, которые не имеют автоматического преобразования MySQL логических значений в целые числа,
(NOT EXISTS (SELECT ...))
следует заменить на:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
В частности, для Oracle потребуется внести еще несколько изменений, не меняя логику ответа, только потому, что Oracle в некоторых областях не следует строгому стандарту ANSI. Протестировано на SQL-Fiddle-2