• 利用MySQL 的GROUP_CONCAT函数实现聚合乘法


    MySQL 聚合函数里面提供了加,平均数。最小,最大等,可是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法。


    先创建一张演示样例表:

    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 $$
    
    
    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聚合函数就能够非常方便的实现乘法了。



    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)




  • 相关阅读:
    js 变量提升和函数提升原理
    解析PHP中intval()等int转换时的意外异常情况
    不要太相信自己的眼睛
    遇到乱码时的一些想法
    c++ --> 变量、常量与运算符
    [ActionScript3.0] 逻辑或"||=" ,等于"=="和全等于"==="
    [ActionScript3.0] 传递任意数量的参数
    [ActionScript3.0] 深表复制
    [ActionScript3.0] 为内建类添加方法
    Jmeter之内存溢出解决办法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5192690.html
Copyright © 2020-2023  润新知