2

テーブルBに変換したいテーブルAがあるとしましょう。

表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の最後に空のfields( "、")を追加します。

これを行うために、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;

length最初のクエリから返されたものはどこですか。

于 2012-10-10T14:13:13.280 に答える