如何在mysql中将行数据转换为列?
我需要帮助将以下格式的数据从2列(ID和描述)转换为6列,如下所示。我们将感谢提供的建议如何在mysql中将行数据转换为列?,mysql,sql,csv,pivot,aggregate-functions,Mysql,Sql,Csv,Pivot,Aggregate Functions,我需要帮助将以下格式的数据从2列(ID和描述)转换为6列,如下所示。我们将感谢提供的建议 Id Description ------ ------------------------------------------------------------------------------------------
Id Description
------ ------------------------------------------------------------------------------------------
1 Company : RAFIQ BRAZING WORK
1 Factory Address : Plot No. 2, 87/B/12, Shop No. 1 , Nr. Lalit
1 Factory Address : Engineering, G.I.D.C., Umber, Dist, Valsad - 7482
,
1 Factory Address : ITHDH
1 Contact Name : Mr. Adam Noor / Mr. Noor,
1 Mobile : 8888761 9323
1 Product : MS Steel,
1 Product : Copper
2 Company : ComapSAPNA STEEL
2 Factory Address: Plot No. 1909, Ill Phase, GIDC, Umbergoan,
2 Factory Address : Dist. Valsad 5er 5334, Arat
2 Mobile : 0260-32517320 Fax: 0260-2562133
2 Contact Name: Mr. Farukh Abdulla Mobile: 6667027032
2 Email: farbdulla@ gmail.com
2 Office address: Gala no. 3, B.T. Compound, malad west, Mumbai - 407777
2 Contact Name: Mr. Hamsa Abdulla Mobile:093333732768
2 Product: Specialist in Profile Cutting, Traders of M.S.Plate,
2 Product : Angels Channels, etc.
ID Company contactperson mobilenumber products factoryaddress
1 RAFIQ BRAZING WORK Mr. Adam Noor/ Mr. Noor +8888761 9323 MS Steel, Copper Plot No. X, 19/B/12, Shop No. 1 , Nr. Lalit Engineering, G.I.D.C., Umber, Dist, Valsad - 7482 ,ITHDH
这是一个糟糕的数据模型。每个属性都应存储为列,而不是隐藏在字符串中 对于您的设置,假设
:'
一致地将属性名称与其值分开,您可以使用如下字符串函数和条件聚合:
select id,
group_concat(case when attr = 'Company' then val end) as company,
group_concat(case when attr = 'Factory Address' then val end) as factory_address,
...
from (
select t.*,
left(description, locate(' : ', description) - 1) as attr,
substring(description, locate(' : ', description) + 3) as val
from mytable t
) t
group by id
子查询将字符串解析为属性/值对,然后外部查询聚合。与其他一些RDBMS不同,MySQL在设计上不支持这种类型的数据透视操作(开发人员认为它更适合应用程序的表示层,而不是数据库层) 如果您必须在MySQL中执行这样的操作,那么构建一个准备好的语句是一个不错的选择,尽管我可能只会使用MySQL的GROUP_CONCAT()函数,而不是处理CASE:
SELECT CONCAT(
'SELECT `table`.id', GROUP_CONCAT('
, `t_', REPLACE(name, '`', '``'), '`.value
AS `', REPLACE(name, '`', '``'), '`'
SEPARATOR ''),
' FROM `table` ', GROUP_CONCAT('
LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '`
ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
SEPARATOR ''),
' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
PREPARE stmt FROM @qry;
EXECUTE stmt;
请注意,GROUP_CONCAT()的结果受GROUP_CONCAT_max_len变量的限制(默认值为1024字节:除非您有一些非常长的名称值,否则此处不太可能相关)。是无描述格式,或者数量有限吗?(如第一个节点)孟买-407777这一行似乎错了,没有第一个节点应该是办公地址:孟买-407777@P.Salmon是的,孟买-407777属于办公地址,数据格式错误。我马上编辑它。此外,“描述”列的数据数量也不受限制。查询只需稍加修改即可工作。。谢谢你,伙计。是的,事实上其他人的数据格式不好,我会处理它,但必须正确格式化:)谢谢你的建议。。我最初尝试使用案例陈述,但没有得到预期的结果。