转换MySQL查询-需要将行转换为列
MYSQL新手用户。。。。我有一个简单的MySQL查询,返回值,并使用GROUP_CONCAT函数:转换MySQL查询-需要将行转换为列,mysql,sql,Mysql,Sql,MYSQL新手用户。。。。我有一个简单的MySQL查询,返回值,并使用GROUP_CONCAT函数: SELECT Productid, Name, GROUP_CONCAT(value) FROM search_export Group By Productid, Name; Productid Name GROUP_CONCAT(value) 666056542 Brand Name Netgear 1054677552
SELECT Productid, Name, GROUP_CONCAT(value)
FROM search_export
Group By Productid, Name;
Productid Name GROUP_CONCAT(value)
666056542 Brand Name Netgear
1054677552 Ethernet Technology Gigabit Ethernet
665655662 Form Factor Wall Mountable,Desktop
56565765 Media Type Supported Twisted Pair
但是,我需要转置查询,以便它将“Name”作为单独的列而不是行返回。MySQL有可能做到这一点吗?您需要执行一个
PIVOT
操作,这是MySQL本机不支持的(与其他一些RDBMS不同)
最接近的方法是按照以下行构造SQL:
SELECT ProductId,
GROUP_CONCAT(IF(Name='Brand Name' ,value,NULL))
AS `Brand Name`,
GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
AS `Ethernet Technology`,
GROUP_CONCAT(IF(Name='Form Factor' ,value,NULL))
AS `Form Factor`,
GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))
AS `Media Type Supported`
FROM search_export
GROUP BY ProductId
如果可能的Name
值是动态的,则可以从以下结果生成更高级语言的SQL:
SELECT DISTINCT Name FROM search_export
事实上,人们甚至可以使用SQL本身:
SELECT CONCAT('
SELECT ProductId, ',
GROUP_CONCAT('
GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))
AS `',REPLACE(Name,'`','``'),'`'
), '
FROM search_export
GROUP BY ProductId
')
INTO @sql
FROM (
SELECT DISTINCT Name FROM search_export
) t;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请注意,如果有许多不同的
名称
值,您可能需要从其默认值1KB增加。您好,是的,多条记录具有不同的名称-我需要每个“名称”行作为一列,因此对于品牌名称|以太网技术|形状因子|媒体类型支持,这正是我今天所需要的。谢谢关于小组讨论的提示非常有用。。很好的解释