縱表和橫表的概念及其相互轉換
橫表就是普通的建表方式,如表結構為:主鍵、欄位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, 科目
結果:
--------------------- 本文來自 zhangzeyuaaa 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/zhangzeyuaaa/article/details/50675058?utm_source=copy