關於豎表轉橫表的問題

2021-03-31 08:56:58 字數 3949 閱讀 7655

關於豎表轉橫表的問題

dinya

內容摘要:在開發過程,經常遇到一些將表的顯示方式進行轉換的需求,我們習慣性稱之為豎表到橫表的轉換,本文通過乙個例子來簡要說明常見的兩種豎表轉橫表的問題。

本文適宜讀者範圍:oracle

初級,中級

系統環境:

os:windows 2000 professional (英文版)

oracle:8.1.7.1.0

正文:

在實際的應用中,我們經常遇到需要轉換資料顯示方式,比如將橫表轉為豎表,或將豎表轉換為橫表的情況,如:課程表的顯示方式,部門平均工資的排名等情況。下面將將根據兩個實例子的需求描述給出兩種常見的豎表轉橫表的解決辦法(本例中的資料意思是:一、二、三年級的各科目最高分統計)。

表結構:

createtabletest_table

(grade_idnumber(8),--

年級:1、一年級,2、二年級,3、三年級

subject_namevarchar2(30),--

科目:包含語文、數學、外語、政治等科目

max_scorenumber(8)--

最高分)

表中資料:

sql> select * from test_table;

grade_idsubject_namemax_score

1語文

95 1

數學98

2語文

86 2

數學90

2政治

87 3

語文93

3數學

88 3

英語88

3政治

97

9 rows selected.

第一種轉換方式:

需求描述:檢視每個年級在系統中存在的科目資訊,並各年級的科目資訊按下面的格式顯示:

grade_idsubject_name1語文

數學2

語文數學政治

3語文

數學英語政治

分析:在要求得到的結果中,每個年級的科目將變成一條記錄,而且每個年級的科目是不固定的。所以考慮寫個函式來解決,輸入年級資訊,使用游標得到該年級的所有科目資訊並返回值。 1

、建函式:

sql> create or replace function test_fun(p_grade number) return varchar2 as

2v_temp varchar2(100):='';

3v_out varchar2(500):='';

4cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

5begin

6open c ;

--開啟游標

7loop

8fetch c into v_temp;

9exit when c%notfound;

10v_out:=v_out||''||v_temp;

11end loop;

12close c;

--關閉游標

13return v_out;

14exception

15when others then

16return 'an error occured';

17end ;

18/

function created.

sql> create or replace function test_fun(p_grade number) return varchar2 as

2v_out varchar2(500):='';

3cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

4begin

5for v_temp in c loop

6v_out:=v_out||''||v_temp.subject_name;

7end loop;--

系統自動關閉游標

8return v_out;

9exception

10when others then

11return 'an error occured';

12end ;

13/

function created.

2

、呼叫函式得到輸入結果:

sql> selectdistincta.grade_id,test_fun(a.grade_id) subjectfromtest_table a;

grade_idsubject

1語文數學

2語文

數學政治 3

語文數學

英語政治

第二種轉換方式:

需求描述:要求將表中的年級、科目及最高的資訊按照下表的格式顯示

,如果該年級沒開的課程

,則其最高分用0表示

:

年級語文

數學英語      政治

一年級

959800

二年級86900

87

三年級

93888897

分析:該需求將年級的分數及科目資訊由縱向轉為橫向,這樣就要針對每個年級的,對其科目進行判斷,存在科目則顯示科目的最高分,如果不存在顯示

0。這時候就考慮到使用

decode

函式來解決。實現如下:

select

decode(t.grade_id,1,'

一年級',2,'

二年級',3,'

三年級') 年級,

sum(decode(t.subject_name,』

語文』,t.max_score,0)) 語文,

sum(decode(t.subject_name,'

數學',t.max_score,0)) 數學,

sum(decode(t.subject_name,'

英語',t.max_score,0)) 英語,

sum(decode(t.subject_name,'

政治',t.max_score,0))

政治from

test_table t

groupby

t.grade_id

需要說明的是,在第一種轉換方式中寫了兩個函式

,兩個函式實現的是同乙個需求,所不同的是,兩個函式中游標使用方式不同,地乙個函式中手動開啟游標,迴圈結束後要求手動關閉。而後乙個函式使用

for

迴圈,迴圈結束後系統自動關閉游標。在第二種轉換方式中,使用了

decode

函式,關於

decode

的詳細用法,請參考

oracle

函式相關文件。

總  結:

上面的兩種轉換方式是在開發中經常遇到的情況

,在開發中的其他類似的轉換都可以參考上面的轉換方式,使用

decode,nvl

等函式進行一些特別的處理即可得到想要的顯示方式

.本文你可以在作者的

blog

blog

。作者blog:  http://blog.csdn.***/dinya2003/

SQL豎表轉橫表 橫表轉豎表

豎表轉橫表 豎表結構 name course grade 張三語文 75張三 數學80 張三英語 90李四 語文95 李四數學 55轉換後橫表結構 name 語文數學 英語張三 7580 90李四 9555 0sql語句 1 select name,2sum case course when 語文 ...

豎表轉橫表

今天遇到乙個要求將豎表轉換成橫表。以前看過豎表轉橫表但沒寫過,現記錄下來以供學習。任務大體要求如下 教師號 星期號 是否有課 有 有 有 有 有 寫一條sql語句讓你變為這樣的表 教師號 星期一 星期二 星期三 建表 create table teac info teac no number,day...

oracle SQL豎表轉橫表

oracle sql豎表轉橫表 t t student表查詢記錄如下,要轉成橫表 姓名 課程 成績 1 張飛 語文 80 2 張飛 數學 87 3 關羽 語文 97 4 張飛 英語 68 5 關羽 數學 53 6 劉備 語文 90 方法一 用decode實現,select t.name,sum de...