MySQL 內建聚合函數有 SUM、AVG、MAX、MIN,卻缺少乘法聚合(PRODUCT)。本文示範如何結合 GROUP_CONCAT 與自定義函數 func_multiple 實現分組乘積計算。
CREATE TABLE tb_seq (
num INT(10) NOT NULL,
seq_type ENUM('yellow','green','red') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO tb_seq (num, seq_type) VALUES
(4,'green'),(1,'red'),(3,'green'),(1,'red'),(8,'red'),
(4,'yellow'),(8,'red'),(7,'yellow'),(10,'red'),
(1,'red'),(1,'red'),(1,'yellow'),
(5,'green'),(9,'red'),(1,'yellow'),(6,'yellow');
DELIMITER $$
CREATE FUNCTION func_multiple(f_nums VARCHAR(1000)) RETURNS DOUBLE(10,2)
BEGIN
DECLARE result DOUBLE(10,2) DEFAULT 1;
DECLARE cnt, i INT DEFAULT 0;
SET cnt = CHAR_LENGTH(f_nums) - CHAR_LENGTH(REPLACE(f_nums, ',', '')) + 1;
WHILE i < cnt DO
SET result = result * REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(f_nums, ',', i+1)), ',', 1));
SET i = i + 1;
END WHILE;
RETURN ROUND(result, 2);
END$$
DELIMITER ;
原理:將 GROUP_CONCAT 產生的逗號分隔字串拆解,迴圈逐一相乘。
SELECT seq_type,
func_multiple(GROUP_CONCAT(num ORDER BY num ASC SEPARATOR ',')) AS multiple_num
FROM tb_seq
GROUP BY seq_type;
| seq_type | multiple_num |
|---|---|
| yellow | 168.00 |
| green | 60.00 |
| red | 5760.00 |
GROUP_CONCAT 預設最大長度 1024 字節,大數據量需調大 group_concat_max_len。