Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql中将行数据转换为列?_Mysql_Sql_Csv_Pivot_Aggregate Functions - Fatal编程技术网

如何在mysql中将行数据转换为列?

如何在mysql中将行数据转换为列?,mysql,sql,csv,pivot,aggregate-functions,Mysql,Sql,Csv,Pivot,Aggregate Functions,我需要帮助将以下格式的数据从2列(ID和描述)转换为6列,如下所示。我们将感谢提供的建议 Id Description ------ ------------------------------------------------------------------------------------------

我需要帮助将以下格式的数据从2列(ID和描述)转换为6列,如下所示。我们将感谢提供的建议

       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属于办公地址,数据格式错误。我马上编辑它。此外,“描述”列的数据数量也不受限制。查询只需稍加修改即可工作。。谢谢你,伙计。是的,事实上其他人的数据格式不好,我会处理它,但必须正确格式化:)谢谢你的建议。。我最初尝试使用案例陈述,但没有得到预期的结果。