SQL Server 2005 及后续版本可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx

  PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。

  UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

一、PIVOT

1. 语法

PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。

SELECT <非透视的列>,

[第一个透视的列] AS <列名称>,

[第二个透视的列] AS <列名称>,

...

[最后一个透视的列] AS <列名称>,

FROM

(<生成数据的 SELECT 查询>)

AS <源查询的别名>

PIVOT

(

<聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

IN ( [第一个透视的列], [第二个透视的列],

... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;

2. 示例

  下面的代码示例根据DaysToManufacture的值生成一个只有两列的表。

SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost

FROM Product

GROUP BY DaysToManufacture;

  下面的代码则将将行转为列,生成一个只有一行的表。DaysToManufacture的值作为列标题,因此这个表一共有6列,列名分别为Cost_Sorted_By_Production_Days、0、1、2、3、4 。

SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,

[0], [1], [2], [3], [4]

FROM

(SELECT DaysToManufacture, StandardCost

FROM Production.Product) AS SourceTable

PIVOT

(

AVG(StandardCost)

FOR DaysToManufacture IN ([0], [1], [2], [3], [4])

) AS PivotTable;

3. 复杂的示例

  下例查询 PurchaseOrderHeader 表以确定由某些特定雇员所下的采购订单数。EmployeeID 列返回的唯一值自行变成了最终结果集中的字段。因此,在透视子句中指定的每个 EmployeeID 号都有相应的一列:在本例中为雇员 164、198、223、231 和 233。PurchaseOrderID 列作为值列,将根据此列对最终输出中返回的列(称为分组列)进行分组。在本例中,通过 COUNT 函数聚合分组列。请注意,将显示一条警告消息,指出为每个雇员计算 COUNT 时未考虑显示在 PurchaseOrderID 列中的任何空值。

SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5

FROM

(SELECT PurchaseOrderID, EmployeeID, VendorID

FROM Purchasing.PurchaseOrderHeader) p

PIVOT

(

COUNT (PurchaseOrderID)

FOR EmployeeID IN

( [250], [251], [256], [257], [260] )

) AS pvt

ORDER BY pvt.VendorID;

二、UNPIVOT

  UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行。假设以上示例中生成的表在数据库中存储为 pvt,并且您需要将列标识符 Emp1、Emp2、Emp3、Emp4 和 Emp5 旋转为对应于特定供应商的行值。这意味着必须标识另外两个列。包含要旋转的列值(Emp1、Emp2...)的列将被称为 Employee,将保存当前位于待旋转列下的值的列被称为 Orders。这些列分别对应于 Transact-SQL 定义中的 pivot_column 和 value_column。以下为该查询。

SELECT VendorID, Employee, Orders

FROM

(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5

FROM pvt) p

UNPIVOT

(Orders FOR Employee IN

(Emp1, Emp2, Emp3, Emp4, Emp5)

)AS unpvt;

  请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的空值不会显示在输出中,而在执行 PIVOT 操作之前,输入中可能有原始的空值。

在 SELECT 查询中使用透视相关推荐

  1. mysql查询依赖的ID_为什么peewee在mysql select查询中包含'id'列?

    我正在尝试学习如何在mysql中使用peewee. 我在mysql服务器上有一个现有的数据库和一个现有的表.表当前为空(我正在测试).>>> db = MySQLDatabase(' ...

  2. 在 SELECT 查询中使用表表达式

    表表达式是一个命名的查询表达式,返回一个虚拟表. 一. 视图(View) 视图是由单个的 SELECT 查询语句定义的.视图中不可以有 ORDER BY 子句和 TOP .OFFSET 等. 视图也是 ...

  3. select查询中@作用_SQL学习第四关:复杂查询

    一.视图1.视图创建练习 course表 CREATE VIEW 每个学生课程平均分(学号,平均分) as select 学号,AVG(成绩) from course GROUP BY 学号; 运行结 ...

  4. 在 SELECT 查询中使用开窗函数

    开窗函数是在 ISO 标准中定义的.SQL Server 提供排名开窗函数和聚合开窗函数. 在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成. ...

  5. 相关子查询中exists后select 加数字的理解

      查看文章     相关子查询中exists后select 加数字的理解 2010-07-23 17:16 前提:两个基础表 SQL> select * from courses; COURS ...

  6. 在Oracle中如何让SELECT查询绕过UNDO

    是否有想过如何在Oracle中实现脏读(dirty read),在Oracle官方文档或者Asktom的时候显然会提到Oracle是不实现脏读的, 总是有undo来提供数据块的前镜像(before i ...

  7. 【力荐】Select查询语句中LIKE关键词的优化方法分析

    今天接到一个优化需求,跑个程序要12+个小时,周期是每天一次,所以时效性极差,不能响应快速的实际业务需求,下面我们看一段LIKE的优化方法. SELECT     bukrs werks lgort ...

  8. php调用mysql查询结果_php - 在php脚本中处理select查询结果集

    在php脚本中执行select查询命令,也是调用mysql_query()函数,但是和执行DML不同的是,执行SELECT 命令后,mysql_query()函数的返回值是一个资源的引用指针(结果集) ...

  9. linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...

    索引优化建议 在MySQL中要尽可能使用覆盖索引进行检索,只访问索引的查询(索引列和查询列一致),减少select * 可提高查询效率 覆盖索引(Covering Index) 理解方式一: 就是se ...

最新文章

  1. python-docx官方声明
  2. laravel框架集成PHPExcel讲解及demo
  3. HDU 1513 Palindrome(最长公共子序列)
  4. python基本使用-python基本用法笔记合集
  5. 2 自己编写:AppDelegate,CCApplication,CCApplicationProtocol
  6. thinkPHP 阿里云OSS 上传文件、直接下载
  7. Android 系统(138 )---Mtk平台 Android 打包解包*.img ,修改system.img 参数
  8. GDB Watchpoints
  9. 【Java】使用MapReduce程序统计PV数量
  10. linux端口连通性测试telnet、wget、ssh、curl
  11. WS2:Windows系统中嵌入式Linux开发之神器
  12. YUV420数据格式详解
  13. PS长阴影生成工具 Long_Shadow_Generator_v1.2_for_CS6.zxp
  14. 【Android】aapt2报错:windows W/ziparchive( 2348): Unable to open ‘badging‘: No such file or directory
  15. 30个专业配色网站, 让你配色从此更专业
  16. 【技术贴】怎么装系统?到店里重装系统,装驱动。价钱多少 ?
  17. 20200305沈剑阿里云MVP分享笔记
  18. 基于mjpg-streamer实现树莓派推流至上位机(自用)
  19. DeFi:过去、现在和未来
  20. 棋盘游戏(二分图最大匹配)

热门文章

  1. 腾讯AI Lab开源800万中文词的NLP数据集 | 资源
  2. 美国喜提刷脸登机,官方开心发通告,竟马上引发公民不适
  3. “懒癌”患者福音:是时候找一个AI帮你做家务了
  4. 《Java8实战》-第五章读书笔记(使用流Stream-02)
  5. 数组常用方法:是否改变原数组
  6. 22. Python 模块2
  7. 采购季:云服务不断进化为企业带来更多选择
  8. eclipse安装hibernate
  9. shell脚本实例-命令记录
  10. minicom与USB转串口