横表 竖表

横表就是普通的建表方式,如表结构为:主键、字段1、字段2、字段3...。 如果变成纵表后,则表结构为: 主键、字段代码、字段值。而字段代码则为字段1、字段2、字段3...。  具体为电信行业的例子。以用户帐单表为例,一般出账时用户有很多费用,其数据一般存储为:时间,客户ID,费用科目,费用。这种存储结构一般称为纵表,其特点是行数多,字段少。纵表在使用时由于行数多,统计用户数或对用户进行分档时还需要进行GROUP BY 操作,性能低,且操作不便,为了提高性能,通常根据需要将纵表进行汇总,形成横表,比如:时间、客户ID、基本通话费、漫游通话费、国内长途费、国际长途费...。

横表

优点:一行表示了一个实体记录,清晰可见,一目了然。

缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。

纵表

优点:如果现在要给这个表加一个字段,只需要添加一些记录。

缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐。

结论

应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。 

纵表转横标

有如下纵表:


将其转为横表:

[sql]  view plain  copy
  1. select  
  2. s.student_name,  
  3. sum(case s.subject when '语文' then s.score end)  as 语文,  
  4. sum(case s.subject when '数学' then s.score end)  as 数学,  
  5. sum(case s.subject when '英语' then s.score end)  as 英语  
  6. from score_vertical s  
  7. group by s.student_name  
结果:


横表转纵表

有如下横表:


将其转为纵表:

[sql]  view plain  copy
  1. select  s.student_name,  
  2. '语文' as 科目,  
  3. s.语文 as 成绩  
  4. from score_horizontal s  
  5.   
  6. union all   
  7.   
  8. select  s.student_name,  
  9. '数学' as 科目,  
  10. s.数学 as 成绩  
  11. from score_horizontal s  
  12.   
  13. union all   
  14.   
  15. select  s.student_name,  
  16. '英语' as 科目,  
  17. s.英语 as 成绩  
  18. from score_horizontal s  
  19.   
  20. order by student_name, 科目  

结果:






  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值