Oracle橫表 縱表一點記錄

2021-06-04 14:04:54 字數 3608 閱讀 4306

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

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

如果變成縱表後,則表結構為:

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

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

縱表對從

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

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

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

橫表的好處是清晰可見,一目了然,但是有乙個弊端,如果現在要把這個表加乙個字段,那麼就必須重建表結構。對於這種情況,在縱表中只需要新增一條記錄,就可以新增乙個字段,所消耗的代價遠比橫錶小,但是縱表的對於資料描述不是很清晰,而且會造成資料庫數量很多,兩者利弊在於此。所以,應 該把不容易改動表結構的設計成橫表,把容易經常改動不確定的表結構設計成縱表。

測試例子:

create table a(name varchar2(12),

math number,

englist number,chinese number);

插入兩行記錄:

張三     85     90      95

李四     90     85      86

轉行查詢語句:

sql** 

select flag, max(李四) as 李四, max(張三) as 張三  

from (select decode(name, '李四', fensu)  as 李四,  

decode(name, '張三', fensu) as 張三,  

flag  

from (select a.name, a.math as fensu, 'math' as flag  

from a  

union all  

select a.name, a.englist as fensu, 'englist' as flag  

from a  

union all  

select a.name, a.chinese as fensu, 'chinese' as flag from a) b  

order by name, flag, fensu)  

group by flag 

現有emp和dept表

empempno          number(4)

ename          varchar2(10)

job                 varchar2(9)        

mgr               number(4)                          

hiredate       date

sal                  number(7,2)                      

comm           number(7,2)

deptno         number(2)

dept

deptno         number(2)   

dname         varchar2(14)

loc                 varchar2(13)      

統計不同部門和工作的員工的總工資

實現橫標轉換為縱表

decode實現

sql** 

select d.dname dname, 

sum(decode(e.job, 'clerk', e.sal, 0)) clerk, 

sum(decode(e.job, 'salesman', e.sal, 0)) salesman, 

sum(decode(e.job, 'analyst', e.sal, 0)) analyst, 

sum(decode(e.job, 'manager', e.sal, 0)) manager, 

sum(decode(e.job, 'president', e.sal, 0)) president 

from emp e 

join dept d 

on e.deptno = d.deptno 

group by d.dname; 

case  when實現 

select d.dname dname, 

sum( 

case e.job 

when 'clerk' then e.sal 

else 0 

end 

) clerk, 

sum( 

case e.job 

when 'salesman' then e.sal 

else 0 

end 

) salesman, 

sum( 

case e.job 

when 'president' then e.sal 

else 0 

end 

) president, 

sum( 

case e.job 

when 'manager' then e.sal 

else 0 

end 

) manager, 

sum( 

case e.job 

when 'analyst' then e.sal 

else 0 

end 

) analyst 

from emp e 

join dept d 

on e.deptno = d.deptno 

group by d.dname; 

帶合計項的 

select d.dname dname, 

sum(decode(e.job, 'clerk', e.sal, 0)) clerk, 

sum(decode(e.job, 'salesman', e.sal, 0)) salesman, 

sum(decode(e.job, 'analyst', e.sal, 0)) analyst, 

sum(decode(e.job, 'manager', e.sal, 0)) manager, 

sum(decode(e.job, 'president', e.sal, 0)) president 

from emp e 

join dept d on e.deptno = d.deptno 

group by d.dname 

union 

select '總計' dname, 

sum(decode(e.job, 'clerk', e.sal, 0)) clerk, 

sum(decode(e.job, 'salesman', e.sal, 0)) salesman, 

sum(decode(e.job, 'analyst', e.sal, 0)) analyst, 

sum(decode(e.job, 'manager', e.sal, 0)) manager, 

sum(decode(e.job, 'president', e.sal, 0)) president 

from emp e 

join dept d2 on e.deptno = d2.deptno 

Oracle橫表轉縱表

現有 scott 使用者下的 emp和 dept表 empempno number 4 ename varchar2 10 jobvarchar2 9 mgrnumber 4 hiredate date salnumber 7,2 comm number 7,2 deptno number 2 de...

Oracle 橫表和縱表

前一段時間了解到的,今天有空寫下,備忘 先來說說橫表和縱坐表的概念,先來看看以下兩圖 第一張圖就是橫表,一行表示了乙個實體記錄,這就是我們傳統的設計表的形式 第二張圖就是縱表,他的一行記錄,是用於表示某個學生的屬性名和屬性值對應關係,像這邊有兩個屬性 名字和性別 在縱表中就要用兩條記錄來表示乙個學生...

橫表縱表轉換

橫表就是普通的建表方式,如表結構為 主鍵 欄位1 欄位2 欄位3.如果變成縱表後,則表結構為 主鍵 字段 字段值。而字段 則為字段1 欄位2 欄位3.具體為電信行業的例子。以使用者帳單表為例,一般出賬時使用者有很多費用,其資料一般儲存為 時間,客戶id,費用科目,費用。這種儲存結構一般稱為縱表,其特...