云服务器网:购买云服务器和VPS必上的网站!

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

行转列
一张表查询结果为行转列select years,(select amount from Tb_Amount as A where month=1 and A.years=Tb_Amount.years)as m1,
(select amount fro

行转列
一张表

查询结果为

–行转列

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

本文来源:https://www.yuntue.com/post/153056.html | 云服务器网,转载请注明出处!

关于作者: yuntue

云服务器(www.yuntue.com)是一家专门做阿里云服务器代金券、腾讯云服务器优惠券的网站,这里你可以找到阿里云服务器腾讯云服务器等国内主流云服务器优惠价格,以及海外云服务器、vps主机等优惠信息,我们会为你提供性价比最高的云服务器和域名、数据库、CDN、免费邮箱等企业常用互联网资源。

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注