mysql - SQL从值创建列并填充其他列

标签 mysql sql pivot

我想从 1 列中获取值,并将它们转换为另一列的标题。它更容易向您展示:

初始表:

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

结束表:

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

由于我在标签上进行的排序和排序类型,因此需要这样的格式。

更新: 当我提到多列值(value)时,我的意思是这样的:

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

最佳答案

使用 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;

Updated SQL Fiddle Demo

关于mysql - SQL从值创建列并填充其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18637160/

相关文章:

mysql - 在mysql中使用am pm获取数据

php - 使用ajax以随机顺序从数据库中获取数据而无需重复输入

sql - 带有 xml 数据的存储过程

sql - 经典 SQL Server 操作

sql server 使用计算列

sql - 如何在 SQL PIVOT 中 ORDER BY

mysql - 按计数分组可能吗?

python - 我的基于 Web 的系统需要一个消息/队列解决方案

sql - 查询以列出父级列中的每个子记录

sql - 将行旋转到没有聚合的列