3

一个菜鸟 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

但是,我需要转置查询,使其返回“名称”作为单独的列,而不是一行。这对 MySQL 来说有可能吗?

4

1 回答 1

10

您需要执行PIVOTMySQL 本身不支持的操作(与其他一些 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;

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

于 2012-11-27T10:15:49.217 回答