好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

前言

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

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

行转列

假如我们有下表:

?

1

2

3

4

5

select *

from student

pivot (

  sum (score) for subject in (语文, 数学, 英语)

)

通过上面 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

?

1

2

3

4

5

select *

from student1

unpivot (

   score for subject in ( "语文" , "数学" , "英语" )

)

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

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

?

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

总结

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

原文链接:https://segmentfault测试数据/a/1190000019220759

查看更多关于SQL行转列、列转行的简单实现的详细内容...

  阅读:25次