• T-Sql中的pivot和unpivot


     写在前面

       今天休息,抽空了解下pivot和unpivot,记得老师讲行转列的时候,貌似提到过,不过他说的最多的就是“这个你们私下可以自己学,很简单的...”,简单你咋不讲呢,不吐槽他了,还是好好整理下上午自学的内容吧。

      pivot运算符实现透视转换

       透视转换是指:将一种数据从行转为列的状态的处理手段。主要经历三个逻辑处理阶段(分组,扩展,聚合)。

       sql2005引入的表的运算符-Pivot,跟其他表运算符(如join)类似,它也是在查询的from子句上下文中执行操作,主要对某原表过表表达式进行操作,返回一个结果表。

       pivot运算符有重要地方需要注意:不必为他显示指定分组元素,或goup by子句,因为它会隐式将那些没有指定为扩展元素,也没有指定为聚合元素的那些元素作为分组元素。

        创建student表如下:

     

        用pivot行转列语句如下:

    select StuName,isnull(语文,0) as 语文 ,isnull(数学,0)as 数学 ,isnull(英语,0) as 英语 from student 
    
     pivot(min(StuGrade) for StuSubject in(语文,数学,英语))p

        这里StuGrade作为聚合元素,StuSubject作为扩展元素,所以剩下的StuName就自动成了分组元素

    结果如下:

     unpivot运算符实现逆透视转换

        逆透视是指:一种将数据从列转换成行状态的处理手段。主要经过三个逻辑处理阶段(生成副本,提取元素,删除不相关的交叉)

        注意的是:经过透视转换得到的表再进行逆透视转换,并不会得到原来的表,因为逆透视只是把透视转换的表再转换一个格式而已,但是经过透视转换后再经过逆透视则能还原表的信息,即透视转换中聚合操作会丢失原表的详细信息,而逆透视则不会丢失任何信息。(因为没有经过聚合操作)

        这里需要借用经过透视转换的结果集。代码如下:

    with cc as
    (
    select stuName,isnull(数学,0) as 数学,isnull(语文,0)as 语文,isnull(英语,0)as 英语 from
    (
    select StuName,isnull(语文,0) as 语文 ,isnull(数学,0)as 数学 ,isnull(英语,0) as 英语 from student 
    
     pivot(min(StuGrade) for StuSubject in(语文,数学,英语))p
    )
    select stuName,StuSubject,StuGrade
    from cc 
    unpivot(StuGrade for StuSubject in(语文,数学,英语))as s

          这里通过cte创建临时结果集,注意upivot跟pivot的写法区别就是:无须经过聚合操作,所以很好记。

    总结

           老师说数据库是很重要的技术,以后工作中离不开它,所以我要好好学习,以后遇到不懂的一定要问,大声说出来。还有就是平时做作业的时候,不会做,不要急着找答案,这样虽然做出来,自己也忘的很快啊,多想,多练,多说(这个看场合,不该说的一定要憋住了),加油!

       

      

  • 相关阅读:
    php 读取webservice接口
    Struts2_day01--课程安排_Struts2概述_入门
    Hibernate_day04--HQL多表查询_Hibernate检索策略
    Hibernate_day04--QBC查询
    Hibernate_day04--HQL查询
    Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询
    Hibernate_day03--Hibernate多对多操作
    Hibernate_day03--课程安排_表之间关系_一对多操作
    Hibernate_day02--Hibernate事务操作_api使用
    Hibernate_day02--Hibernate的一级缓存
  • 原文地址:https://www.cnblogs.com/JaggerMan/p/4188472.html
Copyright © 2020-2023  润新知