【问题标题】:How to change rows to columns in MySQL [duplicate]如何在MySQL中将行更改为列[重复]
【发布时间】:2015-09-29 02:01:54
【问题描述】:

我有一个查询,它显示来自数据库中各种表的一些信息。

SELECT    
                c.Name,
                jp.PieceType,
                jp.Qty
        FROM customer c
        LEFT JOIN job_new jn ON c.JobID = jn.ID
        LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
        WHERE c.Company_ID = 123
        GROUP BY c.ID

我在 sqlfiddle 上创建了数据库:http://www.sqlfiddle.com/#!9/13230/8

每个公司可以有许多件类型,但现在查询只显示一种类型,即使存在更多。在 sqlfiddle 数据库中,您可以看到公司 123 有 3 个 PieceType。

所以我想将片段类型显示为列而不是行。 我希望 PieceTypes 显示在单独的列中,如下所示:

【问题讨论】:

    标签: mysql sql rows


    【解决方案1】:

    你可以使用group_concat():

    SELECT c.Name, group_concat(jp.PieceType) as piecetypes,
            group_concat(jp.Qty) as qtys
    FROM customer c LEFT JOIN
         job_new jn
         ON c.JobID = jn.ID LEFT JOIN
         job_pieces jp
         ON c.JobID = jp.JobID
    WHERE c.Company_ID = 123
    GROUP BY c.ID;
    

    您的原始查询有一个主要的禁忌。 SELECT 中有不在GROUP BY 中的列。 MySQL 扩展 GROUP BY 以允许这种行为。但是,基本上,你永远不应该使用它。当您真正知道自己在做什么时,也许会有一些好处,但没有其他数据库支持此扩展。而且,MySQL 在 5.7.5 版本中使 GROUP BY 符合 ANSI 标准。

    【讨论】:

    • 感谢您的回答,但我希望 PieceTypes 位于单独的列中,而不是全部放在一个列中。我已经编辑了我的问题,以便更清楚我想要做什么
    【解决方案2】:

    嘿,试试这个来旋转表格:SQLFIDDLE

    set @sql = null;
    select
      group_concat(distinct
        concat(
          'max(case when PieceType = ''',
          PieceType,
          ''' then Qty end) AS ',
          concat(PieceType)
        )
      ) into @sql
    from customer c
            LEFT JOIN job_new jn ON c.JobID = jn.ID
            LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
            WHERE c.Company_ID = 123;
    
    set @sql = concat('select c.Name,', @sql, ' FROM customer c
            LEFT JOIN job_new jn ON c.JobID = jn.ID
            LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
            WHERE c.Company_ID = 123
            GROUP BY c.ID
    ');
    
    prepare stmt from @sql;
    execute stmt;
    deallocate prepare stmt;
    

    【讨论】:

    • 是的,谢谢。但是为什么 LEFT JOIN 行有两次呢?
    • 实际上你的数据是有条件的,因此这里使用了这个连接
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2019-01-14
    • 2016-08-30
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多