自定义函数以汇总列内的CSV值

时间:2014-07-26 08:21:18

标签: mysql csv

我的列中有一串逗号分隔的数字。我想总结它们,以便将每个位置的每个单独的数字汇总在一起,并给我一个新的数字串。 (例如[1,2,3,4,5] + [6,7,8,9,0] = [7,9,11,13,5])。

要在mysql中执行此操作,我已在我的sql中定义了一个自定义函数SUMC,然后运行正常的SQL查询。当我在每组中有较少的行(5/6)时,这个工作正常。但是当我在一组中说1000行时,它只需要无限的时间。

有人可以建议我的代码有更好的方法或改进吗? (我在一个查询中总结了很多列。)

MYSQL QUERY:

SELECT col1, col2, SUM(num1), SUMC(GROUP_CONCAT(csv1),COUNT(csv1)) FROM `mytable` GROUP BY col1, col2

SUMC功能:

DELIMITER $$
CREATE FUNCTION SUMC(a TEXT, rop INT)
RETURNS TEXT
DETERMINISTIC
BEGIN
    DECLARE vector,i,j,temp INT;
    DECLARE fin TEXT;
    SET fin = '';
    SET i = 1;
    SET j = 1;
    SET temp = 0;
    SET vector = CHAR_LENGTH(a) - CHAR_LENGTH(REPLACE(a, ',', ''));
    SET vector = (vector+1)/rop;

    myloop1: LOOP
    myloop2: LOOP
        SET temp = temp + SUBSTRING_INDEX(SUBSTRING_INDEX(a,',',(j-1)*vector+i),',',-1);
        IF j = rop THEN
        LEAVE myloop2;
        END IF;
        SET j = j+1;
    END LOOP myloop2;
    SET fin = CONCAT_WS(',',fin,temp);
    SET temp = 0;
    IF i = vector THEN
        LEAVE myloop1;
    END IF;
    SET i = i+1;
    SET j = 1;
    END LOOP myloop1;
    RETURN fin;
END
$$

SQL表:

col1     col2  num1    csv1
k1        K2    2      1,2,3
k1        K2    3      4,5,6
k1        K3    4      0,3,6
k1        K3    5      2,4,7

预期输出:

col1    col2    num1    csv1
k1       K2      5      5,7,9
k1       K3      9      2,7,13

P.S。 1:我当前的代码完美运行...唯一的问题是,当我在一个组中有很多行时,它会花费大量的时间(假设key1有2000行总和)

P.S。 1:在表格中,我有大约450个整数列(如Col1)和50个包含逗号分隔数字的文本列。

1 个答案:

答案 0 :(得分:0)

注意,我实际上并不是在提倡任何类型的解决方案(我不会在SQL中使用非标准化环境)。这只是一件傻事......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,strings VARCHAR(20) NOT NULL
);

INSERT INTO my_table (strings) VALUES ('1,2,3,4,5'),('6,7,8,9,0');

SELECT i
     , GROUP_CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(strings,',',i),',',-1)) x
     , SUM(SUBSTRING_INDEX(SUBSTRING_INDEX(strings,',',i),',',-1)) y
  FROM my_table
     , ints
 WHERE i BETWEEN 1 AND LENGTH(strings)-LENGTH(REPLACE(strings,',',''))+1
 GROUP 
    BY i;

+---+------+------+
| i | x    | y    |
+---+------+------+
| 1 | 1,6  |    7 |
| 2 | 2,7  |    9 |
| 3 | 8,3  |   11 |
| 4 | 4,9  |   13 |
| 5 | 5,0  |    5 |
+---+------+------+ 

(ints is a table of integers from 0-9)