国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 吴川市| 武鸣县| 杂多县| 静安区| 穆棱市| 西峡县| 宜昌市| 桃园县| 衡阳县| 商都县| 万年县| 调兵山市| 济阳县| 德保县| 东莞市| 潮安县| 五寨县| 民丰县| 会同县| 义乌市| 宝清县| 镇坪县| 绥阳县| 丹寨县| 浦江县| 沈丘县| 凯里市| 运城市| 杭州市| 彝良县| 晴隆县| 井冈山市| 宣威市| 岗巴县| 洪泽县| 社会| 上高县| 林西县| 灵石县| 神木县| 齐齐哈尔市|