先介绍一下英文释义:
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. jar与war包区别,转自https://www.jianshu.com/p/3b5c45e8e5bd

    https://www.jianshu.com/p/3b5c45e8e5bd

  2. 源发行版 1.8 需要目标发行版 1.8以及usage of api documented as @since 1.8+

    Maven项目每个Module都有单独的pom.xml,如果不在pom.xml中进行配置,则默认将Module的Language Level设置为5.所以要在pom.xml文件中添加插件进行配置. & ...

  3. css3回顾 checkbox

    <div class="checkBox"> <input type="checkbox" id="check1"> ...

  4. Piwis Tester II V18.100 with CF30 Laptop for Porsche

    Porsche Piwis Tester II is the latest professional tester for Porshe,the most poweful diagnose and o ...

  5. python基础之Day12

    一.闭包函数 什么是闭包函数? 闭:函数是一个内部函数 包:指的是该函数包含对外部作用域(非全局作用域)名字的引用. 给函数传值的方式有两种: 1.使用参数直接给函数传值 2.包给函数 1 2 3 4 ...

  6. Powerdesigner数据库建模的浅谈

    1.建立新模型 2.创建物理数据模型(可以选择数据库类型及版本) 3.建立表 左键点击Table这个图标,鼠标移动到空白工作区,再左键,一个表的视图就出来了,(连续左键,会出现多个表的视图),右键退出 ...

  7. 兼容IE8的flash上传框架"uploadify"自定义上传按钮样式的办法

    (uploadify版本:3.2.1 ) 因为公司业务的原因,所做的项目需要兼容IE8,因此做的上传插件无奈选择的是基于flash的uploadify. 由于是基于flash的,所以使用过程中,难以给 ...

  8. html 基本用法

    html表单表格基本用法,直接贴代码. <html> <head> <title>html基础</title> </head> </b ...

  9. 6.装配Bean基于注解

    1.注解:就是一个类,使用@注解名称 开发中:使用注解 取代 xml配置文件. @Component取代<bean class=""> @Component(" ...

  10. Java集合框架之一:ArrayList源码分析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于 ...