Oracle的数据表中行转列与列转行的操作实例讲解
2015-12-17 00:00
676 查看
行转列
一张表
查询结果为
--行转列
或者为
2.人员信息表包括姓名 时代 金额
显示行转列
姓名 时代 金额
姓名 年轻 中年 老年
张丽 1000000.00 4000000.00 500000000.00
孙子 2000000.00 12233335.00 4552220010.00
3.学生表 [Tb_Student]
显示效果
静态SQL,指subject只有语文、数学、英语这三门课程。
--动态SQL,指subject不止语文、数学、英语这三门课程。
oracle中Decode()函数使用 然后将这些累计求和(sum部分)
列转行
生成
sql代码
生成静态:
ORACLE常用数值函数、转换函数、字符串函数
一张表
查询结果为
--行转列
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.人员信息表包括姓名 时代 金额
显示行转列
姓名 时代 金额
姓名 年轻 中年 老年
张丽 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 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
列转行
生成
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中to_date详细用法示例(oracle日期格式转换)ORACLE常用数值函数、转换函数、字符串函数
相关文章推荐
- ubuntu通过ppa安装oracle jdk
- oracle表分区详解
- oracle表分区详解
- OCP课程之ORACLE审计
- oracle中的 exists 和 in 的效率问题
- Oracle小心得+前言
- Does Oracle GoldenGate requires Xlc.Adt.Include 8.0 (文档 ID 1147116.1)
- oracle存储过程中传入日期参数,插入到表
- ORA-1555,oracle读一致性
- oracle 为什么任何用户都能以SYSDBA登陆 即使用户名和密码都为空也能进入
- Oracle定义两个变量,并对两个变量的值的长度进行判断
- NodeJs oracledb无法完成删除数据项操作的处理方法
- Oracle定义常量和变量
- Oracle 12C 新建用户连接数据库设置
- Oracle的substr函数简单用法 与substring区别
- oracle学习入门系列之五内存结构、数据库结构、进程
- Oracle官方文档结构说明(教你如何快速从官方文档中获取需要的知识)
- 【官方文档】【Doc】oracle官方文档总汇(9i,10g,11gR1, 11gR2)
- ORACLE会使索引失效的条件
- Oracle 12C ORA-65096: 公用用户名或角色名无效