好得很程序员自学网

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

Oracle的数据表中行转列与列转行的操作实例讲解

行转列
一张表

查询结果为

--行转列

?

1

2

3

4

select years,( select amount from Tb_Amount as A where month =1 and A.years=Tb_Amount.years) as m1,

( select amount from Tb_Amount as A where month =2 and A.years=Tb_Amount.years) as m2,

( select amount from Tb_Amount as A where month =3 and A.years=Tb_Amount.years) as m3

from Tb_Amount group by years

或者为

?

1

2

3

4

5

select years as 年份,

sum ( case when month = '1' then amount end ) as 一月,

  sum ( case when month = '2' then amount end ) as 二月,

sum ( case when month = '3' then amount end ) as 三月

from dbo.Tb_Amount group by years order by years desc

2.人员信息表包括姓名 时代  金额

显示行转列
姓名     时代       金额

姓名  年轻         中年       老年

张丽 1000000.00 4000000.00    500000000.00

孙子 2000000.00   12233335.00  4552220010.00

?

1

2

3

4

5

select uname as 姓名,

SUM ( case when era= '年轻' then amount end ) as 年轻,

SUM ( case when era= '中年' then amount end ) as 中年,

SUM ( case when era= '老年' then amount end ) as 老年

from Tb_People group by uname order by uname desc

 3.学生表 [Tb_Student]

显示效果

静态SQL,指subject只有语文、数学、英语这三门课程。

?

1

2

3

4

5

select sname as 姓名,

max ( case Subject when '语文' then grade else 0 end ) as 语文,

max ( case Subject when '数学' then grade else 0 end ) as 数学,

max ( case Subject when '英语' then grade else 0 end ) as 英语

from dbo.Tb_Student group by sname order by sname desc

--动态SQL,指subject不止语文、数学、英语这三门课程。

?

1

2

3

4

5

6

declare @sql varchar (8000)

set @sql = 'select sname as ' + '姓名'

select @sql = @sql + ' , max(case Subject when ' '' + Subject + '' ' then grade else 0 end) [' + Subject + ']'

from ( select distinct Subject from Tb_Student) as a

set @sql = @sql + ' from Tb_Student group by sname order by sname desc'

exec (@sql)

oracle中Decode()函数使用 然后将这些累计求和(sum部分)

?

1

2

3

4

5

select t.sname AS 姓名,

sum (decode(t.subject, '语文' ,grade, null ))语文 ,

sum (decode(t.subject, '数学' ,grade, null )) 数学,

sum (decode(t.subject, '英语' ,grade, null )) 英语

from Tb_Student t group by sname order by sname desc


列转行

生成

sql代码
生成静态:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

select *

from ( select sname,[Course ] = '数学' ,[Score]=[数学] from Tb_students union all

select sname,[Course]= '英语' ,[Score]=[英语] from Tb_students union all

select sname,[Course]= '语文' ,[Score]=[语文] from Tb_students)t

order by sname, case [Course] when '语文' then 1 when '数学' then 2 when '英语' then 3 end

go

  --列转行的静态方案:UNPIVOT,sql2005及以后版本

 

  SELECT sname,Subject, grade

  from dbo.Tb_students

  unpivot(grade for Subject in ([语文],[数学],[英语])) as up

  GO

 

 

  --列转行的动态方案:UNPIVOT,sql2005及以后版本

  --因为行是动态所以这里就从INFORMATION_SCHEMA.COLUMNS视图中获取列来构造行,同样也使用了XML处理。

  declare @s nvarchar(4000)

select @s= isnull (@s+ ',' , '' )+quotename( Name )

from syscolumns where ID=object_id( 'Tb_students' ) and Name not in ( 'sname' )

order by Colid

exec ( 'select sname,[Subject],[grade] from Tb_students unpivot ([grade] for [Subject] in(' +@s+ '))b' )

 

go

select

   sname,[Subject],[grade]

from

   Tb_students

unpivot

   ([grade] for [Subject] in ([数学],[英语],[语文]))b

 

查看更多关于Oracle的数据表中行转列与列转行的操作实例讲解的详细内容...

  阅读:29次