如何在 MySQL 中将行更改为列

How to change rows to columns in MySQL

我有一个查询显示数据库中不同表的一些信息。

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 显示在单独的列中,如下所示:

您可以使用 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 正在使 GROUP BY 版本 5.7.5 符合 ANSI。

嘿试试这个 table 的旋转: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;