2016-04-14 9 views
0

への行の変換のMysql、動的に私は(下記のような)の項目のテーブルを持っている列

 
+------+--------+-------+-----------+-----------+--------+ 
| prod | period | group | item_code | prop_code | value | 
+------+--------+-------+-----------+-----------+--------+ 
| 3 | 199901 |  1 |  101 |   1 | 16240 | 
| 3 | 199902 |  2 |  102 |   2 | 6142 | 
| 3 | 199903 |  1 |  105 |   3 | 340 | 
| 3 | 199904 |  1 |  106 |   4 | 5003 | 
| 3 | 199905 |  1 |  201 |   5 | 3544 | 
| 3 | 199906 |  1 |  202 |   6 |  13 | 
| 3 | 199907 |  1 |  206 |   7 |  9 | 
| 3 | 199908 |  1 |  301 |   8 |  64 | 
| 3 | 199909 |  2 |  302 |   9 | 30408 | 
| 3 | 199910 |  2 |  303 |  10 | 740 | 
| 3 | 199911 |  1 |  304 |  11 | 660 | 
| 3 | 199912 |  1 |  305 |  12 | 1113 | 
| 4 | 200001 |  1 |  306 |  13 | 298881 | 
| 4 | 200002 |  2 |  307 |  14 | 186097 | 
| 4 | 200003 |  1 |  402 |  15 | 600 | 
| 4 | 200004 |  2 |  403 |  16 | 164765 | 
| 4 | 200005 |  2 |  404 |  17 | 203938 | 
| 4 | 200006 |  2 |  405 |  18 | 195 | 
| 4 | 200007 |  1 |  406 |  19 |  80 | 
| 4 | 200008 |  2 |  409 |  20 | 970 | 
| 4 | 200009 |  1 |  502 |  21 | 89012 | 
| 4 | 200010 |  1 |  602 |  22 | 47473 | 
| 4 | 200011 |  2 |  603 |  23 | 775 | 
| 4 | 200012 |  1 |  604 |  24 | 335 | 
+------+--------+-------+-----------+-----------+--------+ 

私は動的に「期間」は、列とそれぞれの「価値」になり、列に行を変更しようとしていますこのような「期間」の下にあるでしょう。 -

 
| prod | group | item_code | prop_code | 199901 | 199902 | 199903 | 199904 | 199905 | 199906 | 199907 | 199908 | 199909 | 199910 | 199911 | 199912 | 200001 | 200002 | 200003 | 200004 | 200005 | 200006 | 200007 | 200008 | 200009 | 200010 | 200011 | 200012 | 

大変ありがとうございます。

+0

その長さを増加させるために – MaxU

+0

おかげで、このサイトやGoogleの 'MySQLのダイナミックpivot'について見て、このSET SESSION group_concat_max_lenを使用することができ、私はなかったが、クエリので、質問を構築することができませんここに。このようなものを試しましたが、エラーが続いています。SET @sql = NULL; 項目FROM @sql INTO GROUP_CONCAT( '期間のようにELSE NULL終了を値) 'DISTINCT CONCAT、 期間、 ( '期間= MAX(CASE'、期間、 ''') )を選択します。 SET @sql = CONCAT( 'SELECT prod、'、@sql、 ' GROUP BY prod'からの アイテム); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; – Pha

+0

あなたの質問を編集し、あなたが試したものを投稿してください。また、表示されるエラーを投稿してください。 – WillardSolutions

答えて

0

は、最大1024文字のGROUP_CONCATの長さに遭遇したようです。 あなたが

SET SESSION group_concat_max_len = 1000000; 
SET @sql = NULL; 
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN period = ', period, ' then value ELSE NULL end) AS period', period, '')) INTO @sql FROM items; 
SET @sql = CONCAT('SELECT prod,`group`,item_code,prop_code, ', @sql, ' FROM items GROUP BY prod,`group`,item_code,prop_code'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

sqlfiddle

+0

多くのありがとうTin Tran。私が持っているテーブルが大きくてもSQLを実行できるようにするために、長さを最大限に設定しなければならなかった18446744073709551615。さらに、正常に実行されたにもかかわらず、結果は得られません(mysqlは空の結果を返しました)。同じものがWorkbenchで正常に動作します。 また、新しいテーブルに結果を挿入する場合、どうすればよいでしょうか – Pha