温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL行列转换怎么弄

发布时间:2026-09-16 12:52:17 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

SQL 里常说的“行列转换”一般分三种情况:行转列(Pivot)列转行(Unpivot),以及用聚合+CASE实现兼容写法。下面用常见示例讲清楚。


一、行转列(多行 → 多列)

场景

原始表 score

name   subject   score
张三   语文      80
张三   数学      90
李四   语文      70
李四   数学      85

目标

name   语文   数学
张三   80     90
李四   70     85

写法 1:标准 SQL(CASE + 聚合,最通用)

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


写法 2:SQL Server / Oracle(PIVOT)

SELECT *
FROM score
PIVOT (
  MAX(score)
  FOR subject IN (语文, 数学)
) p;

二、列转行(多列 → 多行)

场景

name   语文   数学
张三   80     90

目标

name   subject   score
张三   语文      80
张三   数学      90

写法 1:UNION ALL(最通用)

SELECT name, '语文' AS subject, 语文 AS score FROM t
UNION ALL
SELECT name, '数学' AS subject, 数学 AS score FROM t;

写法 2:SQL Server / Oracle(UNPIVOT)

SELECT name, subject, score
FROM t
UNPIVOT (
  score FOR subject IN (语文, 数学)
) u;

三、MySQL 专用(行转列简便写法)

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。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI