2

I want to take values from 1 column, and turn them into headers for another. Its easier to show you:

Initial Table:

Name      | Label   | Value
Tom Jones | January | 42
Rick James| March   | 83

Ending Table:

Name      | January | March
Tom Jones | 42      | NULL
Rick James| NULL    | 83

The format is needed like this because of the type of sorting and ordering that I am doing on the Label.

UPDATE: When I mention multiple columns for value I mean something like:

Name      | Label_1   | ValueA_1 | ValueB_1 | Label_2 | ValueA_2 | ValueB_2
Tom Jones | January   | 42       | 77       | March   | 99       | 22
Rick James| March     | 83       | 17       | May     | NULL     | 112
4

1 回答 1

1

使用CREATE TABLE NewTable AS SELECT ...

CREATE TABLE newTable
SELECT
  NAme, 
  SUM(CASE WHEN Label = 'January' THEN value  END) AS January,
  SUM(CASE WHEN Label = 'March' THEN value END) AS March
FROM tablename AS t1
GROUP BY Name;

newTable这将创建一个与语句结构相同的全新表SELECT


更新:

根据您的评论,如果您想获取value逗号分隔的值:

CREATE TABLE newTable
SELECT
  Name, 
  GROUP_CONCAT(CASE WHEN Label = 'January' THEN value  END) AS January,
  GROUP_CONCAT(CASE WHEN Label = 'March' THEN value  END) AS March
FROM table1 AS t1
GROUP BY Name;

更新:

如果要动态执行此操作,而不是硬编码值,则必须使用动态 sql 执行此操作,如下所示:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('GROUP_CONCAT(IF(Label = ''',
      Label, ''', value, NULL)) AS ', '''', Label , '''')
  ) INTO @sql
FROM Table1 ;

SET @sql = CONCAT('CREATE TABLE newTable ',
                  'SELECT Name,' ,
                  @sql, ' FROM table1 ',
                  ' GROUP BY Name');


prepare stmt 
FROM @sql;

execute stmt;

更新的 SQL Fiddle 演示

于 2013-09-05T13:07:39.210 回答