在Mysql中将表转换为特定格式
我有一张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函数,但是您可以使用带有在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
大小写
表达式的聚合函数将数据从行转换为列:
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;