轉:
縱表和橫表的概念及其相互轉換
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
橫表就是普通的建表方式,如表結構為:主鍵、字段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, 科目
結果:

