縱表和橫表的概念及其相互轉換

2021-07-09 23:18:12 字數 1645 閱讀 4236

橫表就是普通的建表方式,如表結構為:主鍵、欄位1、欄位2、欄位3...。 如果變成縱表後,則表結構為: 主鍵、字段**、字段值。而字段**則為字段1、欄位2、欄位3...。  具體為電信行業的例子。以使用者帳單表為例,一般出賬時使用者有很多費用,其資料一般儲存為:時間,客戶id,費用科目,費用。這種儲存結構一般稱為縱表,其特點是行數多,欄位少。縱表在使用時由於行數多,統計使用者數或對使用者進行分檔時還需要進行group by 操作,效能低,且操作不便,為了提高效能,通常根據需要將縱表進行彙總,形成橫表,比如:時間、客戶id、基本通話費、漫遊通話費、國內長途費、國際長途費...。

橫表

優點:一行表示了乙個實體記錄,清晰可見,一目了然。

缺點:如果現在要給這個表加乙個字段,那麼就必須重建表結構。

縱表

優點:如果現在要給這個表加乙個字段,只需要新增一些記錄。

缺點:資料描述不是很清晰,而且會造成資料庫資料很多。另如果需要分組統計,要先group by,較繁瑣。

結論

應該把不容易改動表結構的設計成橫表,把容易經常改動不確定的表結構設計成縱表。 

有如下縱表:

將其轉為橫表:

select

s.student_name,

sum(case s.subject when '語文' then s.score end) as 語文,

sum(case s.subject when '數學' then s.score end) as 數學,

sum(case s.subject when '英語' then s.score end) as 英語

from score_vertical s

group by s.student_name

結果:

有如下橫表:

將其轉為縱表:

select  s.student_name,

'語文' as 科目,

s.語文 as 成績

from score_horizontal s

union all

select s.student_name,

'數學' as 科目,

s.數學 as 成績

from score_horizontal s

union all

select s.student_name,

'英語' as 科目,

s.英語 as 成績

from score_horizontal s

order by student_name, 科目

結果:

縱表和橫表的概念及其相互轉換

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

SQL server橫表縱表相互轉換

name course grade 張三yuwen 75張三 shuxue 80李四 yingyu 90李四 yuwen 95李四 shuxue 55name yuwen shuxue yingyu 張三75 8090 李四95550 縱表轉橫表 select name,sum case cours...

縱表和橫表的相互轉換與自我理解

縱表轉橫表 橫表轉縱表 優點 一行表示了乙個實體記錄,清晰可見,一目了然。缺點 如果現在要給這個表加乙個字段,那麼就必須重建表結構。優點 如果現在要給這個表加乙個字段,只需要新增一些記錄。缺點 資料描述不是很清晰,而且會造成資料庫資料很多。另如果需要分組統計,要先group by,較繁瑣。應該把不容...