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

时间:2021-05-24

行转列
一张表

查询结果为

--行转列

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 m3from Tb_Amount group by years

或者为

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

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只有语文、数学、英语这三门课程。

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不止语文、数学、英语这三门课程。

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 aset @sql = @sql + ' from Tb_Student group by sname order by sname desc'exec(@sql)

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

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代码
生成静态:

select *from (select sname,[Course ] ='数学',[Score]=[数学] from Tb_students union allselect sname,[Course]='英语',[Score]=[英语] from Tb_students union allselect sname,[Course]='语文',[Score]=[语文] from Tb_students)torder by sname,case [Course] when '语文' then 1 when '数学' then 2 when '英语' then 3 endgo --列转行的静态方案: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 Colidexec('select sname,[Subject],[grade] from Tb_students unpivot ([grade] for [Subject] in('+@s+'))b')goselect sname,[Subject],[grade]from Tb_studentsunpivot ([grade] for [Subject] in([数学],[英语],[语文]))b

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章