zoukankan      html  css  js  c++  java
  • 纵表和横表的概念及其相互转换

    转:

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

    版权声明:本文为博主原创文章,遵循 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, 科目

    结果:

  • 相关阅读:
    bash 设置
    fabric-ca-client
    fabric工具
    nodejs
    Hyperledger 项目
    JAVA集合小结
    java内部类的作用分析
    如何使用javadoc
    30天轻松学习javaweb_Eclipse在修改了web.xml后将自动更新到tomcat服务器中
    30天轻松学习javaweb_修改tomcat的servlet模板
  • 原文地址:https://www.cnblogs.com/libin6505/p/11451511.html
Copyright © 2011-2022 走看看