Oracle中縱橫表的轉化

2021-09-06 19:41:47 字數 2317 閱讀 8369

橫表就是普通的建表方式,如乙個表結構為:

主鍵、欄位1、欄位2、欄位3......

如果變成縱表後,

則表結構為:

主鍵、字段**、字段值。

而字段**則為字段1、欄位2、欄位3。

縱表對從

資料庫到記憶體的對映效率是有影響的,但細一點說也要一分為二:

縱表的初始對映要慢一些;

縱表的變更的對映可能要快一些,如果只是改變了單個欄位時,畢竟橫表字段比縱表要多很多。

橫表的好處是清晰可見,一目了然,但是有乙個弊端,如果現在要把這個表加乙個字段,那麼就必須重建表結構。

對於這種情況,在縱表中只需要新增一條記錄,就可以新增乙個字段,所消耗的代價遠比橫錶小,

但是縱表的對於資料描述不是很清晰,而且會造成資料庫數量很多,兩者各有利弊。

實際工作中,我們經常會遇到縱橫表的轉化,很簡單的例子,假設有張學生成績表(zb)如下:

我現在我需要得到如下的資料

如何才能實現呢,這就需要用到我們上次說的decode或者case來實現。

select name 姓名,

max(case subject when '語文' then result else 0 end) 語文,

max(case subject when '數學' then result else 0 end) 數學,

max(case subject when '物理' then result else 0 end) 物理

from zb

group by name;

select name 姓名,

max(decode(subject, '語文', result, 0)) 語文,

max(decode(subject, '數學', result, 0)) 數學,

max(decode(subject, '物理', result, 0)) 物理

from zb

group by name;

這兩個語句都可以實現我們的需求。

同樣的,如果我們的成績表(hb)是:

而要求得到的是

的話,select *

from (select 姓名 as name, '語文' as subject, 語文 as result

from hb

union all

select 姓名 as name, '數學' as subject, 數學 as result

from hb

union all

select 姓名 as name, '物理' as subject, 物理 as result

from hb) t

order by name,

case subject

when '語文' then

1when '數學' then

2when '物理' then

3end;

此時我們還可以增加總分,平均分的字段:

select *

from (select 姓名 as name, '語文' as subject, 語文 as result

from hb

union all

select 姓名 as name, '數學' as subject, 數學 as result

from hb

union all

select 姓名 as name, '物理' as subject, 物理 as result

from hb

union all

select 姓名 as name,

'平均分' as subject,

cast((語文 + 數學 + 物理) * 1.0 / 3 as decimal(18, 2)) as result

from hb

union all

select 姓名 as name, '總分' as subject, 語文 + 數學 + 物理 as result

from hb) t

order by name,

case subject

when '語文' then

1when '數學' then

2when '物理' then

3when '平均分' then

4when '總分' then

5end;

以上就是所謂的縱橫表的轉化。

Oracle中的表分割槽

table一詞來與數學,在數學中表示關係,在資料庫中對應的硬碟上的物理檔案 例子 get4 學號 姓名 成績 邏輯上存放在一張表,實際存放在物理檔案中 找到425 480之間的資料,如果是上百萬條資料那麼簡單的逐行掃瞄查詢效率過低,所以一種方式就是在存放資料的時候把表中的資料規定存放在某些區域上 4...

Oracle中臨時表

最近考慮到我們的資料庫端寫儲存過程關於臨時表使用的情況,由於我們 現在還不清楚資料庫端到底是怎麼處理的,是否和sql server的處理方式相 同,是否會存在隱患等等一些問題,為了避免將來不必要的麻煩我做了深 入的研究和檢視了一些權威的資料,現在和大家共享,希望大家在處理 oracle臨時表是注意一...

Oracle中臨時表

最近考慮到我們的資料庫端寫儲存過程關於臨時表使用的情況,由於我們 現在還不清楚資料庫端到底是怎麼處理的,是否和 sql server 的處理方式相 同,是否會存在隱患等等一些問題,為了避免將來不必要的麻煩我做了深 入的研究和檢視了一些權威的資料,現在和大家共享,希望大家在處理 oracle 臨時表是...