[오리지널] MySQL을 이용한 GROUPCONCAT 함수 집합 곱셈 실현

MySQL 집합 함수에는 가, 평균수, 최소, 최대 등이 제공되지만 곱셈은 제공되지 않습니다. MYSQL 기존의 GROUPCONCAT 함수는 집합 곱셈을 실현합니다.
먼저 예제 테이블을 생성합니다.
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)

좋은 웹페이지 즐겨찾기