【问题标题】:MySQL Pivot multiple rows into new columnsMySQL将多行旋转到新列
【发布时间】:2026-02-21 16:50:01
【问题描述】:

我正在尝试在 MySQL 工作台中编写一个数据透视函数,而我看过的许多地方都不是超级相关的。

我目前有:

order_ID     Part    Description    Order number
   1          103      A               1
   2          104      B               1
   3          103      A               2
   4          105      C               3
   5          103      A               4
   6          105      C               4
   7          107      D               4

我想创建:

Order    Part1   Description     Part2  Description   Part3 Description  
 1         103        A           104     B
 2         103        A           
 3         105        C           
 4         103        A           105     C            107     D

我可以在输出中保留主键,但这不是必需的。我遇到的问题是许多枢轴函数涉及使用不同的部件名称来移动它们;但是,我有超过 500 个零件。我还想将描述和部件一起移动,以便它们彼此相邻——大多数枢轴函数都不足以解决这个问题。

我确实在 Excel 中编写了一个宏来执行此操作,但它必须在数据库中完成,因为在 R 中进行了进一步分析,并且我正在从数据库中提取数据,并且我必须自动化对数据所做的任何更改。因此,我无法选择数据的组织和布局方式。请不要提及规范化数据或其他数据库技术,因为我正在尝试修复数据以及它有多混乱,但我无法选择数据的输入方式。

我使用了一些资源来获得在 MySQL 中进行旋转的经验,但我无法让任何代码工作。

MySQL pivot table

mysql pivoting - how can I fetch data from the same table into different columns?

http://en.wikibooks.org/wiki/MySQL/Pivot_table

http://buysql.com/mysql/14-how-to-automate-pivot-tables.html

【问题讨论】:

    标签: mysql pivot transpose workbench


    【解决方案1】:
    Select group_concat(Table.column1) as anything, 
    group_concat(Table.column2 separator ';') 
    AS Anything2, Table.`column3`
    FROM Table
    group by Table.column3;
    
    Alter TABLE Table ADD 
      `newcolumn1` varchar(100) DEFAULT '' after `column3`; 
    Alter TABLE MB ADD 
      `newcolumn2` varchar(500) DEFAULT '' after `newcolumn1`;
    
    UPDATE Table SET
        `newcolumn1` = IF ( 
            LOCATE(',', column1) >0,
            SUBSTRING(column1, 1,LOCATE(',', column1)-1),
            column1
    ),
        `newcolumn2` = IF( 
            LOCATE(',', column1) > 0,
            SUBSTRING(column1, LOCATE(',', column1)+1),
            ''); 
    
    UPDATE Table SET 
        newcolumn2 = SUBSTRING_INDEX(newcolumn2, ',', 1);
    UPDATE Table SET 
        newcolumn3 = SUBSTRING_INDEX(newcolumn3, ',', 1);
    

    这段代码完全实现了我上面想要的格式。

    【讨论】: