如何在 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;
我有一个查询显示数据库中不同表的一些信息。
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;