Oracle的數(shù)據(jù)表中行轉(zhuǎn)列與列轉(zhuǎn)行的操作實(shí)例講解
行轉(zhuǎn)列
一張表

查詢結(jié)果為

--行轉(zhuǎn)列
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.人員信息表包括姓名 時(shí)代 金額

顯示行轉(zhuǎn)列
姓名 時(shí)代 金額
姓名 年輕 中年 老年
張麗 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.學(xué)生表 [Tb_Student]

顯示效果

靜態(tài)SQL,指subject只有語(yǔ)文、數(shù)學(xué)、英語(yǔ)這三門(mén)課程。
select sname as 姓名, max(case Subject when '語(yǔ)文' then grade else 0 end) as 語(yǔ)文, max(case Subject when '數(shù)學(xué)' then grade else 0 end) as 數(shù)學(xué), max(case Subject when '英語(yǔ)' then grade else 0 end) as 英語(yǔ) from dbo.Tb_Student group by sname order by sname desc
--動(dòng)態(tài)SQL,指subject不止語(yǔ)文、數(shù)學(xué)、英語(yǔ)這三門(mén)課程。
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()函數(shù)使用 然后將這些累計(jì)求和(sum部分)
select t.sname AS 姓名, sum(decode(t.subject,'語(yǔ)文',grade,null))語(yǔ)文 , sum(decode(t.subject,'數(shù)學(xué)',grade,null)) 數(shù)學(xué), sum(decode(t.subject,'英語(yǔ)',grade,null)) 英語(yǔ) from Tb_Student t group by sname order by sname desc
列轉(zhuǎn)行

生成

sql代碼
生成靜態(tài):
select *
from (select sname,[Course ] ='數(shù)學(xué)',[Score]=[數(shù)學(xué)] from Tb_students union all
select sname,[Course]='英語(yǔ)',[Score]=[英語(yǔ)] from Tb_students union all
select sname,[Course]='語(yǔ)文',[Score]=[語(yǔ)文] from Tb_students)t
order by sname,case [Course] when '語(yǔ)文' then 1 when '數(shù)學(xué)' then 2 when '英語(yǔ)' then 3 end
go
--列轉(zhuǎn)行的靜態(tài)方案:UNPIVOT,sql2005及以后版本
SELECT sname,Subject, grade
from dbo.Tb_students
unpivot(grade for Subject in([語(yǔ)文],[數(shù)學(xué)],[英語(yǔ)]))as up
GO
--列轉(zhuǎn)行的動(dòng)態(tài)方案:UNPIVOT,sql2005及以后版本
--因?yàn)樾惺莿?dòng)態(tài)所以這里就從INFORMATION_SCHEMA.COLUMNS視圖中獲取列來(lái)構(gòu)造行,同樣也使用了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([數(shù)學(xué)],[英語(yǔ)],[語(yǔ)文]))b
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)中的觸發(fā)器詳解
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中觸發(fā)器的相關(guān)資料,觸發(fā)器也是保護(hù)數(shù)據(jù)完整性的一種重要方法,于存儲(chǔ)過(guò)程不同的是,觸發(fā)器是通過(guò)事件進(jìn)行觸發(fā)被執(zhí)行,存儲(chǔ)過(guò)程需要被調(diào)用執(zhí)行,需要的朋友可以參考下2024-02-02
Oracle和MySQL的數(shù)據(jù)導(dǎo)入為何差別這么大
這篇文章主要介紹了Oracle和MySQL的數(shù)據(jù)導(dǎo)入有哪些區(qū)別,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08
Oracle通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)方法示例
這篇文章主要給大家介紹了關(guān)于Oracle如何通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)的相關(guān)資料,遞歸查詢對(duì)各位程序員來(lái)說(shuō)應(yīng)該都不陌生,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
oracle 數(shù)據(jù)按主鍵刪除慢問(wèn)題的解決方法
下面小編就為大家?guī)?lái)一篇oracle 數(shù)據(jù)按主鍵刪除慢問(wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
Linux下啟動(dòng)Oracle服務(wù)和監(jiān)聽(tīng)程序步驟
這篇文章給大家介紹了Linux下啟動(dòng)Oracle服務(wù)和監(jiān)聽(tīng)程序步驟,在文章末尾給大家介紹了Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉方式小結(jié),感興趣的朋友一起看看吧2017-08-08
win x64下安裝oracle 12c出現(xiàn)INS-30131報(bào)錯(cuò)的解決方法
這篇文章主要介紹了win x64下安裝oracle 12c出現(xiàn)INS-30131報(bào)錯(cuò)的解決方法,感興趣的小伙伴們可以參考一下2016-07-07

