• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > Oracle的数据表中行转列与列转行的操作实例讲解

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

作者:真正男子汉 字体:[增加 减小] 来源:互联网 时间:2017-05-11

真正男子汉通过本文主要向大家介绍了oracle中行转列,oracle中行转列函数,oracle数据实例,oracle数据迁移,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
</div>

或者为

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
</div>

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
</div>

 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

</div>

--动态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)

</div>

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
</div>


列转行

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

</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-11常见数据库系统比较 Oracle数据库
  • 2017-05-11Oracle表空间数据文件移动的方法
  • 2017-05-11oracle 视图权限 oracle 创建视图权限不足
  • 2017-05-11一些实用的sql语句
  • 2017-05-11Oracle数据库中的级联查询、级联删除、级联更新操作教程
  • 2017-05-11Oracle日常维护中管理用户以及重做日志文件的方法
  • 2017-05-11Oracle 如何创建和使用全文索引
  • 2017-05-11Oracle MERGE INTO的用法示例介绍
  • 2017-05-11教你如何静默安装ORACLE
  • 2017-05-11Oracle数据库ORA 54013错误的解决办法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Oracle中的INSTR,NVL和SUBSTR函数的用法详解
    • 对学Oracle数据库初学者的开场篇
    • Oracle 数据库操作技巧集
    • Oracle parameter可能值获取方法
    • DB2和 Oracle的并发控制(锁)的比较
    • 删除EM,强制结束EM进程后,启动数据库ORA-00119,ORA-00132报错的解决方法
    • Oracle数据库技术(37)
    • oracle 创建字段自增长实现方式
    • bitmap 索引和 B-tree 索引在使用中如何选择
    • 如何解决Oracle EBS R12 - 以Excel查看输出格式为“文本”的请求时乱码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有