先介绍一下英文释义:
pivot
英 ['pɪvət]  美 ['pɪvət]
n. 枢轴;中心点;旋转运动
vt. 以…为中心旋转;把…置于枢轴上
vi. 在枢轴上转动;随…转移
adj. 枢轴的;关键的
从上面就不难看出这个函数是做什么的,旋转,转换,用于列和行之间对数据进行旋转或透视转换,同时执行聚合预算。
假设现在想查proudct数据表中返回每个员工每年处理过的订单的总价格。在输出中,每个员工占一行,每个订单年份占一列,每个员工行和订单年份列交叉位置上则是总价。以下我们用PIVOT查询可以实现这一需求。
-----需求表如下--------
 
员工     年份    金额
-------------------------
白洁      2005   150
孙倩      2007    360
--------------------------
SQL语句:
SELECT  *
FROM    ( SELECT   NAME ,
                    YEAR(shijian) AS T ,
                    jiage
          FROM      product
        ) AS ov PIVOT ( SUM(jiage) FOR t IN ( [2005], [2006], [2007] ) ) AS p
----------结果如下----------
 
 
下面我们在分析一下PIVOT操作涉及以下三个逻辑阶段:
1.P1:分姐
2.P2:扩展
3:聚合
  第一个阶段(p1)有点意思,从查询语句中可以看到,PIVOT运算符引用了ov中的三个列作为输入参数(shijian(T),jiage),第一阶段会隐式对OV中的行进行分组,分组是根据那些未作为PIVOT输入的所有列,就像是一个GROUT BY子句。这里只有name列没有出现在PIVOT的输入参数中,所有每个员工都一个组。
*PIVOT的隐式分组阶段不会影响查询中其他行何的显式的GROUP BY 子名,因为它最终会生成一个虚拟表,作为下一个逻辑阶段(也可能是另一个表运算,也许是WHERE阶段)的输入。
第二个阶段(P2)将把(spreading_col)列表中的值扩展到它们相应的目标列上,下面用代码解释一下,更加直观:
case when shijian=2005 then jiage end,
case when shijian=2006 then jiage end,
case when shijian=2007 then jiange end
*不带ELSE的子句的CASE表达式相录于包含一个隐式的ELSE NULL
每三阶段(3)第三个阶段对每个CASE表达式应用指定的聚合函数,生成结果列,来段代码,更加直观:
sum(case when shijian=2006 then jiage end)as 2005,
sum(case when shijian=2006 then jiage end)as 2006,
sum(case when shijian=2007 then jiage end)as 2007
总之PIVOT查询在逻辑上相当于下面的语句:
 
SELECT  name ,
        SUM(CASE WHEN t = 2006 THEN jiage
            END) AS [2005] ,
        SUM(CASE WHEN t = 2006 THEN jiage
            END) AS [2006] ,
        SUM(CASE WHEN t = 2007 THEN jiage
            END) AS [2007]
FROM    ( SELECT    name ,
                    YEAR(shijian) AS t ,
                    jiage
          FROM      product
        ) AS ov
GROUP BY name
     
------结果如下----------------
 
 
----2017-08-03 1:13 深圳福田梅林三村----

PIVOT 行列相转的更多相关文章

  1. SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

    原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...

  2. SQL中PIVOT 行列转换

    来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...

  3. MS SQL PIVOT数据透视表

    以前曾经做过练习<T-SQL PIVOT 行列转换>https://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 今天把拿出来 ...

  4. UGUI RectTransform

    RectTransform解析 当 Anchor 在同一点时,显示的是物体的座标与大小Pos X.Pos Y.Width.Height ,当 Anchor 不在同一点时(此时会形成矩形),显示的会是 ...

  5. Unity的界面排版: RectTransform

    看Unity3D文档像看国内教课书一样,一些概念,不懂的时候看还是不懂,明白了以后再看,好像也没有说错.好几个做Unity3D的朋友跟我吐槽过U3D的文档质量,相比Apple贴心的技术文档相去甚远. ...

  6. 数据清理,预处理 pandas dataframe 操作技巧 总结

    dsoft2 = data1.loc[(data1['程'] == "轻") | (data1['程'] == "中")]设置x下标plt.xticks(np. ...

  7. Anchors Piovt详解

    这个两个东西是RectTransform里面的两个属性,也是UGUI做UI自适应的重要工具,之前做的的时候,都只是调出效果即可,并没有深究其中的原理,现在决定来补上这个漏洞. 首选我们来看看Ancho ...

  8. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  9. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

随机推荐

  1. Java 接口多继承

    按照理解,一般都是说Java 类是单继承,但可以实现多个接口.但是可以通过接口来实现类的多继承.(如何通过接口来实现多继承???) 那么就一直以为Java里面是单继承,今天看FutureTask源码的 ...

  2. 在python学习时间过程中,你会不断发现需要解决的问题,更多需要连接未知,这时候到哪里去查阅资料呢?

    1.safari online book https://www.safaribooksonline.com 知乎上有人问,送程序员什么礼物好,其中一个答案就是safari online.编程的英文书 ...

  3. 关于前端设置cookie

    cookie既可以后端设置也可以在前端设置,例如登陆/注册功能,每次都要向服务器请求用户数据,这种就可以把cookie放到前端储存起来. 当网页要发http请求时,浏览器会先检查是否有相应的cooki ...

  4. sqlserver 更新通过 select 查询出的结果集

    update Babies set BirthOrder =tb.sn from Babies b1, (select ROW_NUMBER() over (partition by familyid ...

  5. face_recognition 模块安装

    https://blog.csdn.net/qq_15192373/article/details/78623741 https://blog.csdn.net/roguesir/article/de ...

  6. tian_lie

    后台托管:nohup ./re_start_job.sh kg_fk_etl >>log.log 2>&1 & 查看进程:ps -ef|grep kg_fk_etl ...

  7. linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <

    重定向命令其实用得不少吧,只是重来都没有仔细看过,这波正好又用到 又有空总结一波. 先看>和>>: 他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文 ...

  8. SimpleDateFormat的parse(String str)方法的用法

    SimpleDateFormate 中的parse 方法可以将string类型的字符串转换成特定的date的特定类型.

  9. 2019.02.14 codechef Chef at the Food Fair(线段树+泰勒展开)

    传送门 题意:现在有nnn个位置,每个位置上有一个值aia_iai​. 要求支持如下两种操作: 区间乘vvv 求区间的(1−ai)(1-a_i)(1−ai​)之积 思路: 考虑转换式子: Ans=∏i ...

  10. 20155326刘美岑 《网络对抗》Exp1 PC平台逆向破解

    20155326刘美岑 <网络对抗>逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...