我有一个查询,它显示数据库中各种表的一些信息。
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。
所以我想将片段类型显示为列而不是行。 我希望PieceTypes显示在单独的列中,如下所示:
答案 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标准。