MySQL 聚合函数里面提供了加,平均数,最小,最大等,但是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法。
先创建一张示例表:
1
2
3
4
|
CREATE
TABLE
`tb_seq` (
`num`
int
(10)
NOT
NULL
,
`seq_type` enum(
'yellow'
,
'green'
,
'red'
)
NOT
NULL
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8;
|
插入示例数据:
1
2
3
4
5
6
7
|
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'
);
|
创建基于逗号分隔符的字符串乘法,前提是字符串逗号分隔的都是数字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
DELIMITER $$
USE `t_girl`$$
DROP
FUNCTION
IF EXISTS `func_multiple`$$
CREATE
DEFINER=`root`@`localhost`
FUNCTION
`func_multiple`(
f_nums
VARCHAR
(1000)
)
RETURNS
DOUBLE
(10,2)
BEGIN
-- Created by ytt 2014/10/21.
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
-- get multiple result.
SET
result = result * REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(f_nums,
','
,i+1)),
','
,1));
SET
i = i + 1;
END
WHILE;
SET
result = ROUND(result,2);
RETURN
result;
END
$$
DELIMITER ;
|
好了,我们利用我创建的函数以及MYSQL自带的GROUP_CONCAT聚合函数就可以很方便的实现乘法了。
1
2
3
4
5
6
7
8
9
|
SELECT
seq_type,func_multiple(GROUP_CONCAT(num
ORDER
BY
num
ASC
SEPARATOR
','
))
AS
multiple_num
FROM
tb_seq
WHERE
1
GROUP
BY
seq_type;
+
----------+--------------+
| seq_type | multiple_num |
+
----------+--------------+
| yellow | 168.00 |
| green | 60.00 |
| red | 5760.00 |
+
----------+--------------+
3
rows
in
set
(0.00 sec)
|
本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1566281,如需转载请自行联系原作者 |