纵表和横表的概念及其相互转换

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

横表

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

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

纵表

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

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

结论

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

纵表转横标

有如下纵表:

将其转为横表:

 
  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

结果:

横表转纵表

有如下横表:

将其转为纵表:

 
  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, 科目

结果:

猜你喜欢

转载自blog.csdn.net/u012501054/article/details/82627641