一个新手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
Run Code Online (Sandbox Code Playgroud)
但是,我需要转置查询,以便将"Name"作为单独的列返回,而不是行.这有可能与MySQL有关吗?
egg*_*yal 10
您需要执行一项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
Run Code Online (Sandbox Code Playgroud)
如果可能的Name值是动态的,您可以从以下结果生成更高级语言的SQL:
SELECT DISTINCT Name FROM search_export
Run Code Online (Sandbox Code Playgroud)
实际上,人们甚至可以使用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;
Run Code Online (Sandbox Code Playgroud)
请注意,如果存在许多不同的Name值,则可能需要group_concat_max_len从默认值1KiB 增加.
| 归档时间: |
|
| 查看次数: |
9692 次 |
| 最近记录: |