在Mysql中将表转换为特定格式

在Mysql中将表转换为特定格式,mysql,sql,database,relational-database,Mysql,Sql,Database,Relational Database,我有一张170万行的桌子。 表结构为(Datapoint、AttributeName、AttributeValue) 第一列即数据点如下所示: (1,AttributeName 1,AttributeValue 1) (1,AttributeName 2.AttributeValue 2) . . n次 (2,AttributeName 1,AttributeValue 1) (2,AttributeName 2,AttributeValue 2) . . m倍 (11113,Attribute

我有一张170万行的桌子。 表结构为(Datapoint、AttributeName、AttributeValue)

第一列即数据点如下所示: (1,AttributeName 1,AttributeValue 1) (1,AttributeName 2.AttributeValue 2) . . n次 (2,AttributeName 1,AttributeValue 1) (2,AttributeName 2,AttributeValue 2) . . m倍 (11113,AttributeName 1,AttributeValue 1) (11113,AttributeName 2,AttributeValue 2) . . 有时 我需要用SQL编写一个过程,将上述数据转换为以下格式:

(Datapoint,AttributeName1,AttributeName2,.............AttributeNamen) (1, ,AttributeValue1,AttributeValue2,.........................) (2, ,AttributeValue1,AttributeValue2,.........................) (11113, ,AttributeValue1,AttributeValue2,.........................) (数据点、AttributeName1、AttributeName2等AttributeName) (1、AttributeValue 1、AttributeValue 2等) (2、AttributeValue 1、AttributeValue 2等) (11113,AttributeValue 1,AttributeValue 2,……) 请告诉我怎么办。 感谢您

MySQL没有pivot函数,但是您可以使用带有
大小写
表达式的聚合函数将数据从行转换为列:

select datapoint,
  max(case when AttributeName ='AttributeName1' then AttributeValue end) as AttributeName1,
  max(case when AttributeName ='AttributeName2' then AttributeValue end) as AttributeName2,
  max(case when AttributeName ='AttributeName3' then AttributeValue end) as AttributeName3,
  max(case when AttributeName ='AttributeName4' then AttributeValue end) as AttributeName4
from yourtable
group by datapoint
如果您有已知数量的值,上述版本将非常有效。但如果要转换为列的项数目未知,则需要使用准备好的语句来生成动态SQL。您应该阅读以下文章:

代码与此类似:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN AttributeName = ''',
      AttributeName,
      ''' THEN AttributeValue END) AS `',
      AttributeName, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql 
  = CONCAT('SELECT datapoint, ', @sql, ' 
           from yourtable
           group by datapoint');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请提及您尝试过的内容。搜索“mysql pivot”或“mysql rows to columns”我需要像您在第二种方法中所做的那样进行概括。但我不清楚代码,您能告诉我从哪里可以阅读更多关于上述内容的信息,以便了解发生了什么吗?@SahilMadan我编辑了我的答案,并链接到一篇文章,但这里是链接——非常感谢!!我理解它是如何工作的。过程正在执行,没有任何错误。但是“从@sql准备stmt”中有一些语法错误。不知道是什么。对此有什么想法吗?@SahilMadan错误消息是什么?这就是错误“从@sql准备stmt错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“SELECT Datapoint,SELECT Datapoint,max”附近使用的正确语法(当AttributeName='12'然后在第1行0.000秒处使用Attr'时)
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN AttributeName = ''',
      AttributeName,
      ''' THEN AttributeValue END) AS `',
      AttributeName, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql 
  = CONCAT('SELECT datapoint, ', @sql, ' 
           from yourtable
           group by datapoint');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;