关于竖表转横表的问题
生活随笔
收集整理的這篇文章主要介紹了
关于竖表转横表的问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文作者:dinya
內(nèi)容摘要:在開(kāi)發(fā)過(guò)程,經(jīng)常遇到一些將表的顯示方式進(jìn)行轉(zhuǎn)換的需求,我們習(xí)慣性稱(chēng)之為豎表到橫表的轉(zhuǎn)換,本文通過(guò)一個(gè)例子來(lái)簡(jiǎn)要說(shuō)明常見(jiàn)的兩種豎表轉(zhuǎn)橫表的問(wèn)題。
本文適宜讀者范圍:oracle初級(jí),中級(jí)
系統(tǒng)環(huán)境:
??? os:windows 2000 professional (英文版)
oracle:8.1.7.1.0
正文:
在實(shí)際的應(yīng)用中,我們經(jīng)常遇到需要轉(zhuǎn)換數(shù)據(jù)顯示方式,比如將橫表轉(zhuǎn)為豎表,或?qū)⒇Q表轉(zhuǎn)換為橫表的情況,如:課程表的顯示方式,部門(mén)平均工資的排名等情況。下面將將根據(jù)兩個(gè)實(shí)例子的需求描述給出兩種常見(jiàn)的豎表轉(zhuǎn)橫表的解決辦法(本例中的數(shù)據(jù)意思是:一、二、三年級(jí)的各科目最高分統(tǒng)計(jì))。
表結(jié)構(gòu):
create table test_table
(
??? grade_id number(8),???????????? --年級(jí):1、一年級(jí),2、二年級(jí),3、三年級(jí)
??? subject_name varchar2(30),??? --科目:包含語(yǔ)文、數(shù)學(xué)、外語(yǔ)、政治等科目
??? max_score number(8)???????????? --最高分
)
表中數(shù)據(jù):
sql> select * from test_table;
?grade_id??? subject_name?????????????????? max_score
??????? 1????? 語(yǔ)文????????????????????????????????? 95
??????? 1????? 數(shù)學(xué)????????????????????????????????? 98
??????? 2????? 語(yǔ)文????????????????????????????????? 86
??????? 2????? 數(shù)學(xué)????????????????????????????????? 90
??????? 2????? 政治????????????????????????????????? 87
??????? 3????? 語(yǔ)文????????????????????????????????? 93
??????? 3????? 數(shù)學(xué)????????????????????????????????? 88
??????? 3????? 英語(yǔ)?????????????????????? ???????????88
??????? 3????? 政治????????????????????????????????? 97
9 rows selected.
?
第一種轉(zhuǎn)換方式:
需求描述:查看每個(gè)年級(jí)在系統(tǒng)中存在的科目信息,并各年級(jí)的科目信息按下面的格式顯示:
grade_id????? subject_name??
???????? 1????? 語(yǔ)文? 數(shù)學(xué)
2????? 語(yǔ)文? 數(shù)學(xué)? 政治
3????? 語(yǔ)文? 數(shù)學(xué)? 英語(yǔ)? 政治
分析:在要求得到的結(jié)果中,每個(gè)年級(jí)的科目將變成一條記錄,而且每個(gè)年級(jí)的科目是不固定的。所以考慮寫(xiě)個(gè)函數(shù)來(lái)解決,輸入年級(jí)信息,使用游標(biāo)得到該年級(jí)的所有科目信息并返回值。
1、建函數(shù):
sql> create or replace function test_fun(p_grade number) return varchar2 as
? 2????? v_temp varchar2(100):=;
? 3????? v_out varchar2(500):=;
? 4????? cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;
? 5? begin
? 6????? open c ; --打開(kāi)游標(biāo)
? 7????? loop
? 8????????? fetch c into v_temp;
? 9????????? exit when c%notfound;
?10????????? v_out:=v_out||? ||v_temp;
?11????? end loop;
?12????? close c;??? ??--關(guān)閉游標(biāo)
?13????? return v_out;
?14????? exception
?15????????? when others then
?16????????????? return an error occured;???????
?17? end ;
?18? /
function created.
?
sql> create or replace function test_fun(p_grade number) return varchar2 as
? 2???? ?v_out varchar2(500):=;
? 3????? cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;
? 4? begin
? 5????? for v_temp in c loop
? 6????????? v_out:=v_out||? ||v_temp.subject_name;
? 7????? end loop;?????? --系統(tǒng)自動(dòng)關(guān)閉游標(biāo)
? 8????? return v_out;
? 9????? exception
?10????????? when others then
?11????????????? return an error occured;
?12? end ;
?13? /
function created.
?
2、調(diào)用函數(shù)得到輸入結(jié)果:
sql> select distinct a.grade_id,test_fun(a.grade_id) subject from test_table a;
?grade_id??????????? subject
1??????? 語(yǔ)文? 數(shù)學(xué)
2???????? 語(yǔ)文? 數(shù)學(xué)? 政治
3???????? 語(yǔ)文? 數(shù)學(xué)? 英語(yǔ)? 政治
?
第二種轉(zhuǎn)換方式:
需求描述:要求將表中的年級(jí)、科目及最高的信息按照下表的格式顯示,如果該年級(jí)沒(méi)開(kāi)的課程,則其最高分用0表示:
年級(jí)?????? 語(yǔ)文????????? 數(shù)學(xué)???????? 英語(yǔ) 政治
一年級(jí)??????? 95?????????? 98??????????? 0?????????????? 0
二年級(jí)??????? 86?????????? 90??????????? 0???????????? ?87
三年級(jí)??????? 93?????????? 88?????????? 88????????????? 97
?
分析:該需求將年級(jí)的分?jǐn)?shù)及科目信息由縱向轉(zhuǎn)為橫向,這樣就要針對(duì)每個(gè)年級(jí)的,對(duì)其科目進(jìn)行判斷,存在科目則顯示科目的最高分,如果不存在顯示0。這時(shí)候就考慮到使用decode函數(shù)來(lái)解決。實(shí)現(xiàn)如下:
?select
??? decode(t.grade_id,1,一年級(jí),2,二年級(jí),3,三年級(jí)) 年級(jí),
??? sum(decode(t.subject_name,’語(yǔ)文’,t.max_score,0)) 語(yǔ)文,
??? sum(decode(t.subject_name,數(shù)學(xué),t.max_score,0)) 數(shù)學(xué),
??? sum(decode(t.subject_name,英語(yǔ),t.max_score,0)) 英語(yǔ),
??? sum(decode(t.subject_name,政治,t.max_score,0)) 政治
from
??? test_table t
group by
??? t.grade_id
?
需要說(shuō)明的是,在第一種轉(zhuǎn)換方式中寫(xiě)了兩個(gè)函數(shù),兩個(gè)函數(shù)實(shí)現(xiàn)的是同一個(gè)需求,所不同的是,兩個(gè)函數(shù)中游標(biāo)使用方式不同,地一個(gè)函數(shù)中手動(dòng)打開(kāi)游標(biāo),循環(huán)結(jié)束后要求手動(dòng)關(guān)閉。而后一個(gè)函數(shù)使用for 循環(huán),循環(huán)結(jié)束后系統(tǒng)自動(dòng)關(guān)閉光標(biāo)。在第二種轉(zhuǎn)換方式中,使用了decode函數(shù),關(guān)于decode的詳細(xì)用法,請(qǐng)參考o(jì)racle函數(shù)相關(guān)文檔。
總 結(jié):
上面的兩種轉(zhuǎn)換方式是在開(kāi)發(fā)中經(jīng)常遇到的情況,在開(kāi)發(fā)中的其他類(lèi)似的轉(zhuǎn)換都可以參考上面的轉(zhuǎn)換方式,使用decode,nvl等函數(shù)進(jìn)行一些特別的處理即可得到想要的顯示方式.
本文你可以在作者的blog上找到,更多內(nèi)容請(qǐng)登陸作者的blog。
作者blog:? http://blog.csdn.net/dinya2003/
如轉(zhuǎn)載,請(qǐng)保留作者blog信息.
文章整理:站長(zhǎng)天空 網(wǎng)址:http://www.z6688.com/
以上信息與文章正文是不可分割的一部分,如果您要轉(zhuǎn)載本文章,請(qǐng)保留以上信息,謝謝!
內(nèi)容摘要:在開(kāi)發(fā)過(guò)程,經(jīng)常遇到一些將表的顯示方式進(jìn)行轉(zhuǎn)換的需求,我們習(xí)慣性稱(chēng)之為豎表到橫表的轉(zhuǎn)換,本文通過(guò)一個(gè)例子來(lái)簡(jiǎn)要說(shuō)明常見(jiàn)的兩種豎表轉(zhuǎn)橫表的問(wèn)題。
本文適宜讀者范圍:oracle初級(jí),中級(jí)
系統(tǒng)環(huán)境:
??? os:windows 2000 professional (英文版)
oracle:8.1.7.1.0
正文:
在實(shí)際的應(yīng)用中,我們經(jīng)常遇到需要轉(zhuǎn)換數(shù)據(jù)顯示方式,比如將橫表轉(zhuǎn)為豎表,或?qū)⒇Q表轉(zhuǎn)換為橫表的情況,如:課程表的顯示方式,部門(mén)平均工資的排名等情況。下面將將根據(jù)兩個(gè)實(shí)例子的需求描述給出兩種常見(jiàn)的豎表轉(zhuǎn)橫表的解決辦法(本例中的數(shù)據(jù)意思是:一、二、三年級(jí)的各科目最高分統(tǒng)計(jì))。
表結(jié)構(gòu):
create table test_table
(
??? grade_id number(8),???????????? --年級(jí):1、一年級(jí),2、二年級(jí),3、三年級(jí)
??? subject_name varchar2(30),??? --科目:包含語(yǔ)文、數(shù)學(xué)、外語(yǔ)、政治等科目
??? max_score number(8)???????????? --最高分
)
表中數(shù)據(jù):
sql> select * from test_table;
?grade_id??? subject_name?????????????????? max_score
??????? 1????? 語(yǔ)文????????????????????????????????? 95
??????? 1????? 數(shù)學(xué)????????????????????????????????? 98
??????? 2????? 語(yǔ)文????????????????????????????????? 86
??????? 2????? 數(shù)學(xué)????????????????????????????????? 90
??????? 2????? 政治????????????????????????????????? 87
??????? 3????? 語(yǔ)文????????????????????????????????? 93
??????? 3????? 數(shù)學(xué)????????????????????????????????? 88
??????? 3????? 英語(yǔ)?????????????????????? ???????????88
??????? 3????? 政治????????????????????????????????? 97
9 rows selected.
?
第一種轉(zhuǎn)換方式:
需求描述:查看每個(gè)年級(jí)在系統(tǒng)中存在的科目信息,并各年級(jí)的科目信息按下面的格式顯示:
grade_id????? subject_name??
???????? 1????? 語(yǔ)文? 數(shù)學(xué)
2????? 語(yǔ)文? 數(shù)學(xué)? 政治
3????? 語(yǔ)文? 數(shù)學(xué)? 英語(yǔ)? 政治
分析:在要求得到的結(jié)果中,每個(gè)年級(jí)的科目將變成一條記錄,而且每個(gè)年級(jí)的科目是不固定的。所以考慮寫(xiě)個(gè)函數(shù)來(lái)解決,輸入年級(jí)信息,使用游標(biāo)得到該年級(jí)的所有科目信息并返回值。
1、建函數(shù):
sql> create or replace function test_fun(p_grade number) return varchar2 as
? 2????? v_temp varchar2(100):=;
? 3????? v_out varchar2(500):=;
? 4????? cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;
? 5? begin
? 6????? open c ; --打開(kāi)游標(biāo)
? 7????? loop
? 8????????? fetch c into v_temp;
? 9????????? exit when c%notfound;
?10????????? v_out:=v_out||? ||v_temp;
?11????? end loop;
?12????? close c;??? ??--關(guān)閉游標(biāo)
?13????? return v_out;
?14????? exception
?15????????? when others then
?16????????????? return an error occured;???????
?17? end ;
?18? /
function created.
?
sql> create or replace function test_fun(p_grade number) return varchar2 as
? 2???? ?v_out varchar2(500):=;
? 3????? cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;
? 4? begin
? 5????? for v_temp in c loop
? 6????????? v_out:=v_out||? ||v_temp.subject_name;
? 7????? end loop;?????? --系統(tǒng)自動(dòng)關(guān)閉游標(biāo)
? 8????? return v_out;
? 9????? exception
?10????????? when others then
?11????????????? return an error occured;
?12? end ;
?13? /
function created.
?
2、調(diào)用函數(shù)得到輸入結(jié)果:
sql> select distinct a.grade_id,test_fun(a.grade_id) subject from test_table a;
?grade_id??????????? subject
1??????? 語(yǔ)文? 數(shù)學(xué)
2???????? 語(yǔ)文? 數(shù)學(xué)? 政治
3???????? 語(yǔ)文? 數(shù)學(xué)? 英語(yǔ)? 政治
?
第二種轉(zhuǎn)換方式:
需求描述:要求將表中的年級(jí)、科目及最高的信息按照下表的格式顯示,如果該年級(jí)沒(méi)開(kāi)的課程,則其最高分用0表示:
年級(jí)?????? 語(yǔ)文????????? 數(shù)學(xué)???????? 英語(yǔ) 政治
一年級(jí)??????? 95?????????? 98??????????? 0?????????????? 0
二年級(jí)??????? 86?????????? 90??????????? 0???????????? ?87
三年級(jí)??????? 93?????????? 88?????????? 88????????????? 97
?
分析:該需求將年級(jí)的分?jǐn)?shù)及科目信息由縱向轉(zhuǎn)為橫向,這樣就要針對(duì)每個(gè)年級(jí)的,對(duì)其科目進(jìn)行判斷,存在科目則顯示科目的最高分,如果不存在顯示0。這時(shí)候就考慮到使用decode函數(shù)來(lái)解決。實(shí)現(xiàn)如下:
?select
??? decode(t.grade_id,1,一年級(jí),2,二年級(jí),3,三年級(jí)) 年級(jí),
??? sum(decode(t.subject_name,’語(yǔ)文’,t.max_score,0)) 語(yǔ)文,
??? sum(decode(t.subject_name,數(shù)學(xué),t.max_score,0)) 數(shù)學(xué),
??? sum(decode(t.subject_name,英語(yǔ),t.max_score,0)) 英語(yǔ),
??? sum(decode(t.subject_name,政治,t.max_score,0)) 政治
from
??? test_table t
group by
??? t.grade_id
?
需要說(shuō)明的是,在第一種轉(zhuǎn)換方式中寫(xiě)了兩個(gè)函數(shù),兩個(gè)函數(shù)實(shí)現(xiàn)的是同一個(gè)需求,所不同的是,兩個(gè)函數(shù)中游標(biāo)使用方式不同,地一個(gè)函數(shù)中手動(dòng)打開(kāi)游標(biāo),循環(huán)結(jié)束后要求手動(dòng)關(guān)閉。而后一個(gè)函數(shù)使用for 循環(huán),循環(huán)結(jié)束后系統(tǒng)自動(dòng)關(guān)閉光標(biāo)。在第二種轉(zhuǎn)換方式中,使用了decode函數(shù),關(guān)于decode的詳細(xì)用法,請(qǐng)參考o(jì)racle函數(shù)相關(guān)文檔。
總 結(jié):
上面的兩種轉(zhuǎn)換方式是在開(kāi)發(fā)中經(jīng)常遇到的情況,在開(kāi)發(fā)中的其他類(lèi)似的轉(zhuǎn)換都可以參考上面的轉(zhuǎn)換方式,使用decode,nvl等函數(shù)進(jìn)行一些特別的處理即可得到想要的顯示方式.
本文你可以在作者的blog上找到,更多內(nèi)容請(qǐng)登陸作者的blog。
作者blog:? http://blog.csdn.net/dinya2003/
如轉(zhuǎn)載,請(qǐng)保留作者blog信息.
文章整理:站長(zhǎng)天空 網(wǎng)址:http://www.z6688.com/
以上信息與文章正文是不可分割的一部分,如果您要轉(zhuǎn)載本文章,請(qǐng)保留以上信息,謝謝!
轉(zhuǎn)載于:https://www.cnblogs.com/Godblessyou/archive/2010/07/17/1779621.html
總結(jié)
以上是生活随笔為你收集整理的关于竖表转横表的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一些提高工作效率的黑科技软件
- 下一篇: 每一件事情的开始总是很困难的!