SQL 里常说的“行列转换”一般分三种情况:行转列(Pivot)、列转行(Unpivot),以及用聚合+CASE实现兼容写法。下面用常见示例讲清楚。
原始表 score:
name subject score
张三 语文 80
张三 数学 90
李四 语文 70
李四 数学 85
name 语文 数学
张三 80 90
李四 70 85
SELECT
name,
MAX(CASE WHEN subject='语文' THEN score END) AS 语文,
MAX(CASE WHEN subject='数学' THEN score END) AS 数学
FROM score
GROUP BY name;
✅ 适用于 MySQL / PostgreSQL / SQL Server / Oracle
SELECT *
FROM score
PIVOT (
MAX(score)
FOR subject IN (语文, 数学)
) p;
name 语文 数学
张三 80 90
name subject score
张三 语文 80
张三 数学 90
SELECT name, '语文' AS subject, 语文 AS score FROM t
UNION ALL
SELECT name, '数学' AS subject, 数学 AS score FROM t;
SELECT name, subject, score
FROM t
UNPIVOT (
score FOR subject IN (语文, 数学)
) u;
MySQL 没有 PIVOT,但可用:
SELECT
name,
SUM(subject='语文') * 0 + MAX(CASE WHEN subject='语文' THEN score END) AS 语文,
MAX(CASE WHEN subject='数学' THEN score END) AS 数学
FROM score
GROUP BY name;
或者动态 SQL(列不固定时):
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN subject=''', subject, ''' THEN score END) AS ', subject)
) INTO @sql FROM score;
SET @sql = CONCAT('SELECT name, ', @sql, ' FROM score GROUP BY name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
| 需求 | 通用写法 | SQL Server / Oracle |
|---|---|---|
| 行转列 | CASE + 聚合 | PIVOT |
| 列转行 | UNION ALL | UNPIVOT |
如果你有具体表结构或数据库类型(MySQL / Oracle / SQL Server),可以直接发出来,我帮你写精准 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。