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

 更新时间:2015年12月17日 17:19:41   作者:真正男子汉  
这篇文章主要介绍了Oracle数据表中行转列与列转行的操作方法,这里分静态和动态情况作出了分类讨论,需要的朋友可以参考下

行转列
一张表

20151217170849821.jpg (220×151)

查询结果为

20151217170911011.jpg (170×63)

--行转列

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

或者为

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.人员信息表包括姓名 时代  金额

20151217170947066.jpg (254×150)

显示行转列
姓名     时代       金额

姓名  年轻         中年       老年

张丽 1000000.00 4000000.00    500000000.00

孙子 2000000.00   12233335.00  4552220010.00

20151217171005767.jpg (322×84)

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]

20151217171053471.jpg (204×144)

显示效果

20151217171109012.jpg (191×56)

静态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 a
set @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


列转行

20151217171127272.jpg (225×66)

生成

20151217171144405.jpg (223×134)

sql代码
生成静态:

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数据库中的触发器详解

    Oracle数据库中的触发器详解

    这篇文章主要给大家介绍了关于Oracle数据库中触发器的相关资料,触发器也是保护数据完整性的一种重要方法,于存储过程不同的是,触发器是通过事件进行触发被执行,存储过程需要被调用执行,需要的朋友可以参考下
    2024-02-02
  • Oracle CPU高的问题及分析

    Oracle CPU高的问题及分析

    这篇文章主要介绍了Oracle CPU高的问题及分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Oracle和MySQL的数据导入为何差别这么大

    Oracle和MySQL的数据导入为何差别这么大

    这篇文章主要介绍了Oracle和MySQL的数据导入有哪些区别,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Oracle通过递归查询父子兄弟节点方法示例

    Oracle通过递归查询父子兄弟节点方法示例

    这篇文章主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • oracle 数据按主键删除慢问题的解决方法

    oracle 数据按主键删除慢问题的解决方法

    下面小编就为大家带来一篇oracle 数据按主键删除慢问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Oracle如何直接运行OS命令(上)

    Oracle如何直接运行OS命令(上)

    Oracle如何直接运行OS命令(上)...
    2007-03-03
  • Linux下启动Oracle服务和监听程序步骤

    Linux下启动Oracle服务和监听程序步骤

    这篇文章给大家介绍了Linux下启动Oracle服务和监听程序步骤,在文章末尾给大家介绍了Oracle数据库的启动和关闭方式小结,感兴趣的朋友一起看看吧
    2017-08-08
  • oracle存储过程常用的技巧(详)

    oracle存储过程常用的技巧(详)

    存储过程是在大型数据库系统中存储过程在数据库中经过第一次编译后就不需要再次编译,用户通过指定存储过程的名字并给出参数来,通过本篇文章带领大家去学习oracle存储过程常用的技巧,感兴趣的朋友一起来学习吧
    2015-08-08
  • win x64下安装oracle 12c出现INS-30131报错的解决方法

    win x64下安装oracle 12c出现INS-30131报错的解决方法

    这篇文章主要介绍了win x64下安装oracle 12c出现INS-30131报错的解决方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Oracle外键不加索引引起死锁示例

    Oracle外键不加索引引起死锁示例

    这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下
    2014-05-05

最新评论