SQL行转列、列转行的简单实现

2025-05-25 0 44

前言

行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。

行列转换就是如下图所示两种展示形式的互相转换

SQL行转列、列转行的简单实现

行转列

假如我们有下表:

SQL行转列、列转行的简单实现

?
1
2
3
4
5
select *
from student
pivot (
 sum(score) for subject in (语文, 数学, 英语)
)

通过上面 sql 语句即可得到下面的结果

SQL行转列、列转行的简单实现

pivot 后跟一个聚合函数来拿到结果,for 后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。in 后面跟的就是具体的科目值。

当然我们也可以用 case when 得到同样的结果,就是写起来麻烦一点。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
select name,
 max(
 case
 when subject=\'语文\'
 then score
 else 0
 end) as \"语文\",
 max(
 case
 when subject=\'数学\'
 then score
 else 0
 end) as \"数学\",
 max(
 case
 when subject=\'英语\'
 then score
 else 0
 end) as \"英语\"
from student
group by name

使用 case when 可以得到和 pivot 同样的结果,没有 pivot 简单直观。

列转行

假设我们有下表 student1

SQL行转列、列转行的简单实现

?
1
2
3
4
5
select *
from student1
unpivot (
  score for subject in (\"语文\",\"数学\",\"英语\")
)

通过 unpivot 即可得到如下结果:

SQL行转列、列转行的简单实现

我们也可以使用下面方法得到同样结果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
select
  name,
  \'语文\' as subject ,
  max(\"语文\") as score
from student1 group by name
union
select
  name,
  \'数学\' as subject ,
  max(\"数学\") as score
from student1 group by name
union
select
  name,
  \'英语\' as subject ,
  max(\"英语\") as score
from student1 group by name

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 SQL行转列、列转行的简单实现 https://www.kuaiidc.com/51773.html

相关文章

发表评论
暂无评论