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


 

轉:

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

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接: https://blog.csdn.net/zhangzeyuaaa/article/details/50675058

橫表就是普通的建表方式,如表結構為:主鍵、字段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, 科目

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM