先介绍一下英文释义:
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. Shell中read命令--学习

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  2. [leetcode]48. Rotate Image旋转图像

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  3. Solidity的地址 数组如何判断是否包含一个给定的地址?

    Q: given address[] wallets. What is the correct method to check that the list contains a given addre ...

  4. php进程(线程)通信基础--System V共享内存

    PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项  System V消息,--enable-sysvmsg   System V信号量支持,--enable-sysvsem ...

  5. playframework 一步一步来 之 日志(一)

    日志模块是一个系统中必不可少的一部分,它可以帮助我们写程序的时候查看错误信息,利于调试和维护,在业务面,它也可以记录系统的一些关键性的操作,便于系统信息的监控和追踪. play的日志是基于logbac ...

  6. OpenSessionViewFilter

    OpenSessionViewFilter是spring提供的一个针对hibernate的一个支持类,其主要的意思是=在发起一个页面请求的时候打开session,并且保持session直到请求结束,具 ...

  7. 牛客练习赛42 C 反着计算贡献

    https://ac.nowcoder.com/acm/contest/393/C 题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m<= ...

  8. shell脚本学习-printf命令

    跟着RUNOOB网站的教程学习的笔记 printf命令模仿C程序库里的printf()程序.printf由POSIX标准所定义,因此使用printf的脚本比使用echo有着更好的移植性. printf ...

  9. IIC通讯协议(非原创,转载他人,用于学习)

    I2C协议:1.空闲状态 2.开始信号 3.停止信号 4.应答信号 5.数据的有效性 6.数据传输 IIC详解 1.I2C总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL 2.IIC总 ...

  10. noip第21课资料