Tôi không biết có cách nào để xác định hàm tổng hợp mới không, không phải là không làm phiền với mã nguồn MySQL.
Nhưng nếu số của bạn đều dương, bạn cũng có thể xuất phát từ danh tính số học:
log( product( Ai ) ) = sum( log( Ai ) )
mà bạn có thể sử dụng EXP(SUM(LOG(x)))
để tính toán PRODUCT(x)
. Kiểm tra trong SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Khi dữ liệu có thể có 0, nó phức tạp hơn một chút:
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 ;
Đã thử nghiệm tại SQL-Fiddle
Đối với các DBMS khác, không có tự động chuyển đổi các giá trị boolean của MySQL sang số nguyên,
(NOT EXISTS (SELECT ...))
nên được thay thế bằng:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
Cụ thể đối với Oracle, sẽ cần thêm một vài thay đổi, mà không thay đổi logic của câu trả lời, chỉ vì Oracle không tuân theo tiêu chuẩn ANSI nghiêm ngặt trong một số lĩnh vực. Đã thử nghiệm tại SQL-Fiddle-2