-- 方式一:使用 CASE WHEN 进行行转列
SELECT
id,
MAX(CASE WHEN subject = 'Math' THEN score END) AS Math,
MAX(CASE WHEN subject = 'English' THEN score END) AS English,
MAX(CASE WHEN subject = 'Science' THEN score END) AS Science
FROM
scores
GROUP BY
id;
-- 解释:通过 CASE WHEN 语句将不同的科目转换为列,并使用 MAX 函数来确保每个学生每门课的成绩只显示一次。
-- 方式二:使用 PIVOT 函数(适用于 MySQL 8.0 及以上版本)
SELECT * FROM (
SELECT id, subject, score FROM scores
) AS src
PIVOT (
MAX(score) FOR subject IN ('Math', 'English', 'Science')
) AS pvt;
-- 解释:PIVOT 函数可以直接将行数据转换为列数据,简化了 SQL 语句的编写。需要注意的是,PIVOT 函数在 MySQL 8.0 及以上版本中可用。
-- 方式三:使用 GROUP_CONCAT 和 SUBSTRING_INDEX 函数组合实现行转列
SELECT
id,
SUBSTRING_INDEX(GROUP_CONCAT(IF(subject = 'Math', score, NULL)), ',', 1) AS Math,
SUBSTRING_INDEX(GROUP_CONCAT(IF(subject = 'English', score, NULL)), ',', 1) AS English,
SUBSTRING_INDEX(GROUP_CONCAT(IF(subject = 'Science', score, NULL)), ',', 1) AS Science
FROM
scores
GROUP BY
id;
-- 解释:通过 GROUP_CONCAT 和 SUBSTRING_INDEX 函数组合,可以实现行转列的效果。这种方法适用于较早版本的 MySQL。
上一篇:decimal mysql
下一篇:mysql row_format
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站