国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

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

2024-08-29 13:58:44
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Oracle數(shù)據(jù)表中行轉(zhuǎn)列與列轉(zhuǎn)行的操作方法,這里分靜態(tài)和動態(tài)情況作出了分類討論,需要的朋友可以參考下
 

行轉(zhuǎn)列
一張表

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

查詢結(jié)果為

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

--行轉(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 m3from 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.人員信息表包括姓名 時代  金額

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

顯示行轉(zhuǎn)列
姓名     時代       金額

姓名  年輕         中年       老年

張麗 1000000.00 4000000.00    500000000.00

孫子 2000000.00   12233335.00  4552220010.00

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

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]

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

顯示效果

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

靜態(tài)SQL,指subject只有語文、數(shù)學(xué)、英語這三門課程。

select sname as 姓名,max(case Subject when '語文' then grade else 0 end) as 語文,max(case Subject when '數(shù)學(xué)' then grade else 0 end) as 數(shù)學(xué),max(case Subject when '英語' then grade else 0 end) as 英語from dbo.Tb_Student group by sname order by sname desc

--動態(tài)SQL,指subject不止語文、數(shù)學(xué)、英語這三門課程。

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 aset @sql = @sql + ' from Tb_Student group by sname order by sname desc'exec(@sql)

oracle中Decode()函數(shù)使用 然后將這些累計求和(sum部分)

select t.sname AS 姓名,sum(decode(t.subject,'語文',grade,null))語文 ,sum(decode(t.subject,'數(shù)學(xué)',grade,null)) 數(shù)學(xué),sum(decode(t.subject,'英語',grade,null)) 英語from Tb_Student t group by sname order by sname desc


列轉(zhuǎn)行

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

生成

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

sql代碼
生成靜態(tài):

select *from (select sname,[Course ] ='數(shù)學(xué)',[Score]=[數(shù)學(xué)] from Tb_students union allselect sname,[Course]='英語',[Score]=[英語] from Tb_students union allselect sname,[Course]='語文',[Score]=[語文] from Tb_students)torder by sname,case [Course] when '語文' then 1 when '數(shù)學(xué)' then 2 when '英語' then 3 endgo --列轉(zhuǎn)行的靜態(tài)方案:UNPIVOT,sql2005及以后版本  SELECT sname,Subject, grade from dbo.Tb_students unpivot(grade for Subject in([語文],[數(shù)學(xué)],[英語]))as up GO   --列轉(zhuǎn)行的動態(tài)方案:UNPIVOT,sql2005及以后版本 --因為行是動態(tài)所以這里就從INFORMATION_SCHEMA.COLUMNS視圖中獲取列來構(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 Colidexec('select sname,[Subject],[grade] from Tb_students unpivot ([grade] for [Subject] in('+@s+'))b')goselect  sname,[Subject],[grade]from  Tb_studentsunpivot  ([grade] for [Subject] in([數(shù)學(xué)],[英語],[語文]))b
 


注:相關(guān)教程知識閱讀請移步到oracle教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 丹江口市| 浙江省| 三河市| 青河县| 东山县| 鹰潭市| 偃师市| 廊坊市| 株洲市| 洛隆县| 进贤县| 山丹县| 沙河市| 惠安县| 应城市| 威远县| 区。| 读书| 银川市| 潼南县| 合江县| 清丰县| 宁陕县| 金昌市| 庆元县| 乌兰察布市| 祁连县| 都匀市| 江阴市| 沙田区| 边坝县| 南皮县| 乐清市| 柳州市| 都昌县| 苍山县| 扶沟县| 通城县| 凤凰县| 开封市| 肃宁县|