转置MySQL查询 - 将行转为列

4

作为一名刚入门的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  Ethernet Technology  Gigabit Ethernet
665655662   Form Factor          Wall Mountable,Desktop
56565765    Media Type Supported     Twisted Pair

然而,我需要转置查询结果,以使'Name'作为单独的列,而不是一行。在MySQL中是否可能实现这一点?


嗨,是的,有多个记录具有不同的名称 - 我需要每个“名称”行作为一列,例如品牌名称|以太网技术|形式因素|支持的媒体类型。 - Marc
1个回答

11
您需要执行一个PIVOT操作,在MySQL中这并不是一个本地支持的操作(与其他一些关系型数据库管理系统不同)。
最接近的方法是构建以下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;

请注意,如果有很多不同的Name值,您可能需要将group_concat_max_len从默认的1KiB增加。

1
group_concat_max_len的提示非常有帮助...解释得非常好。 - UberNeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接