2

假设我有一个表 A我想转换成表 B

表 B中的值应始终是具有相同字段数的CSV 格式文本。

首先,我需要知道给定类别处理的值的最大数量是多少(在本例中,类别 1、2 和 4 中的3 个值);

其次,当类别具有“缺失”值时,我还需要使用该变量将空字段(“,”)“添加”到 GROUP_CONCAT 的末尾。

我需要这个在每个单元格中都有一个“一致的”CSV。我用来处理这些数据的应用程序不能很好地解释具有不同列号的 CSV...

表 A

+----+----------+-------+
| id | category | value |
+----+----------+-------+
| 1  |    1     |   a   |
| 2  |    1     |   b   |
| 3  |    1     |   c   |
| 4  |    2     |   d   |
| 5  |    2     |   e   |
| 6  |    2     |   f   |
| 7  |    3     |   g   |
| 8  |    3     |   h   |
| 9  |    4     |   i   |
| 10 |    4     |   j   |
| 11 |    4     |   k   |
| 12 |    5     |   l   |
+----+----------+-------+

表 B

+--------------+---------------------+
| id(category) | value(group_concat) |
+--------------+---------------------+
|      1       |        a,b,c        |
|      2       |        d,e,f        |
|      3       |        g,h,         |
|      4       |        i,j,k        |
|      5       |        l,,          |
+--------------+---------------------+

编辑(SQLFiddle):

http://sqlfiddle.com/#!2/825f8

4

1 回答 1

1

首先,要获得给定类别处理的最大数量的值

select count(category) from tableA group by category order by count(category) desc limit 1;

其次,当类别具有“缺失”值时,将空字段(“,”)添加到 GROUP_CONCAT 的末尾。

我创建了一个名为 unify_length 的函数来帮助做到这一点。

这是功能:

delimiter $$

CREATE FUNCTION `unify_length`(csv_list CHAR(255), length INT) RETURNS char(255)
    DETERMINISTIC
BEGIN        
        WHILE ((SELECT LENGTH(csv_list) - LENGTH(REPLACE(csv_list, ',', ''))) < length-1) DO /* count the number of occurrances in a string*/
            SET csv_list = CONCAT(csv_list, ',');        
        END WHILE;

        RETURN csv_list;
END$$

这是函数调用:

select category, unify_length(GROUP_CONCAT(value), length) from tablea group by category;

wherelength是第一个查询返回的内容。

于 2012-10-10T14:13:13.280 回答