如何在MySQL中将行更改为列

时间:2015-07-10 10:41:07

标签: mysql sql rows

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

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个PieceTypes。 enter image description here

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

2 个答案:

答案 0 :(得分:4)

嘿试试这个用于旋转表: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;

答案 1 :(得分:0)

您可以使用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标准。