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

以下是带批注的 PIVOT 语法:

SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,...[最后一个透视的列] AS <列名称>,
FROM(<生成数据的 SELECT 查询>)AS <源查询的别名>
PIVOT
(<聚合函数>(<要聚合的列>)
FOR
[<包含要成为列标题的值的列>]IN ( [第一个透视的列], [第二个透视的列],... [最后一个透视的列])
) AS <透视表的别名>
<可选的 ORDER BY 子句>;

原文链接:https://blog.csdn.net/yx183/article/details/82423420

让我们先从一个虚构的场景中来着手吧
万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIncome 表

create table DailyIncome
(VendorId nvarchar(10),
IncomeDay nvarchar(10), IncomeAmount int)

–VendorId 供应商ID,
–IncomeDay 收入时间
–IncomeAmount 收入金额
紧接着来插入数据看看
(留意看下,有的供应商某天中会有多次收入,应该是分批进账的)

insert into DailyIncome values ('SPIKE', 'FRI', 100)
insert into DailyIncome values ('SPIKE', 'MON', 300)
insert into DailyIncome values ('FREDS', 'SUN', 400)
insert into DailyIncome values ('SPIKE', 'WED', 500)
insert into DailyIncome values ('SPIKE', 'TUE', 200)
insert into DailyIncome values ('JOHNS', 'WED', 900)
insert into DailyIncome values ('SPIKE', 'FRI', 100)
insert into DailyIncome values ('JOHNS', 'MON', 300)
insert into DailyIncome values ('SPIKE', 'SUN', 400)
insert into DailyIncome values ('JOHNS', 'FRI', 300)
insert into DailyIncome values ('FREDS', 'TUE', 500)
insert into DailyIncome values ('FREDS', 'TUE', 200)
insert into DailyIncome values ('SPIKE', 'MON', 900)
insert into DailyIncome values ('FREDS', 'FRI', 900)
insert into DailyIncome values ('FREDS', 'MON', 500)
insert into DailyIncome values ('JOHNS', 'SUN', 600)
insert into DailyIncome values ('SPIKE', 'FRI', 300)
insert into DailyIncome values ('SPIKE', 'WED', 500)
insert into DailyIncome values ('SPIKE', 'FRI', 300)
insert into DailyIncome values ('JOHNS', 'THU', 800)
insert into DailyIncome values ('JOHNS', 'SAT', 800)
insert into DailyIncome values ('SPIKE', 'TUE', 100)
insert into DailyIncome values ('SPIKE', 'THU', 300)
insert into DailyIncome values ('FREDS', 'WED', 500)
insert into DailyIncome values ('SPIKE', 'SAT', 100)
insert into DailyIncome values ('FREDS', 'SAT', 500)
insert into DailyIncome values ('FREDS', 'THU', 800)
insert into DailyIncome values ('JOHNS', 'TUE', 600)

让我们先来看看前十行数据:

select top 10 * from DailyIncome

如图所示:

虽然数据是能够完全给展示了,但好像一眼望去不能得到对我们用处更大的信息,比如说我们想得到每个供应商的每天的总收入,这时我们应该做一些数据形式的转变了,平常的所用的是这样的。

select VendorId ,
sum(case when  IncomeDay='MoN' then IncomeAmount else 0 end) MON,
sum(case when  IncomeDay='TUE' then IncomeAmount else 0 end) TUE,
sum(case when  IncomeDay='WED' then IncomeAmount else 0 end) WED,
sum(case when  IncomeDay='THU' then IncomeAmount else 0 end) THU,
sum(case when  IncomeDay='FRI' then IncomeAmount else 0 end) FRI,
sum(case when  IncomeDay='SAT' then IncomeAmount else 0 end) SAT,
sum(case when  IncomeDay='SUN' then IncomeAmount else 0 end) SUN
from DailyIncome group by VendorId

得到如下的结果:

case when结果
如果大家仔细看结果的话,会有这样的发现,这是把VendorID进行了分组,并且对于每组中IncomeDay这一列中的值都变成了新的列名字,然后对IncomeAmount进行求和操作。
这样写可能是有些麻烦,别着急,我们用Pivot函数进行行转列试下。

select * from DailyIncome ----第一步
pivot
(
sum (IncomeAmount) ----第三步
for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步
) as AvgIncomePerDay

来解释下,要想用好Pivot函数,应该理解代码注释中的这几步。
第一步:肯定是要明白数据源了,这里是DailyIncome
第二步:要明白要想让哪一列的值做新的列名字
第三步:要明白对于这新的列要求那些值呢?

转载 https://www.jianshu.com/p/8f929264995e

用pivot的时候,要注意
Pivot有一个隐藏的Group 分组, 除了Pivot column 和value列,其他列作为分组

Example:

IF NOT EXISTS(SELECT * FROM sys.tables where name = 'Pivot_test')CREATE TABLE Pivot_test(id1 int,id2 int,Pivot_column varchar(50),value char(50))insert into Pivot_test values(1,1,'A','A_V'),(1,1,'B','B_V'),(1,1,'C','C_V'),(1,1,'D','D_V')

行列转换

select * from Pivot_test
PIVOT(MAX(value) for Pivot_column in (A,B,C,D)) tem

更新A的id2值为2,再次行列转换,发现出现两行,证明id2影响了分组

update Pivot_test set id2 = 2 WHERE Pivot_column = 'A'select * from Pivot_test PIVOT(MAX(value) for Pivot_column in (A,B,C,D)) tem

更新A的id1值为2,id2更新为旧的值1,再次查看行列转换结果,发现结果仍为两行,证明id1也在分组中

update Pivot_test set id2 = 1 WHERE Pivot_column = 'A'update Pivot_test set id1 = 2 WHERE Pivot_column = 'A'select * from Pivot_test PIVOT(MAX(value) for Pivot_column in (A,B,C,D)) tem

以上证明pivot是以除了Pivot column 和value的其他所有列作为分组

转载 https://www.cnblogs.com/qianlixing/p/6648622.html

SQL中PIVOT的用法相关推荐

  1. 关于SQL中PIVOT函数的使用方法

    文章目录 前言 一.关于PIVOT函数    1.什么是PIVOT函数 2.它能实现什么样的效果 二.使用方法 三.使用前后的效果 总结 前言 这篇文章给大家分享的是"pivot函数是什么, ...

  2. SQL中Truncate的用法

    转自:https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html 本文导读:删除表中的数据的方法有delete,truncate, 其中T ...

  3. 【SQL中limit的用法】

    SQL中limit的用法 说明:limit子句用于限制查询结果返回的数量,常用于分页查询. 用法:[select * from tableName limit i,n ] 参数:tableName: ...

  4. sql去重复操作详解SQL中distinct的用法

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...

  5. 行转列:SQL SERVER PIVOT与用法解释

    在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIM ...

  6. SQL中的limit用法

    limit用法 SQL中的limit函数是用来对数据库中的字段进行限制提取的,如:一个用户表中有许多的用户信息,如果想要取出其中某个位置的某几条数据,就可以使用limit函数. 结构 limit函数结 ...

  7. 教你学会Sql中 ROW_NUMBER的用法

    ROW_NUMBER SqlServer 2005 推出的新功能.语法:select *,ROW_Number() over(order by 字段) as '新列名' from table顾名思义: ...

  8. SQL中Case语句用法讨论

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  9. SQL中的declare用法

     平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c# ...

最新文章

  1. 《深入理解计算机系统》第十章——系统级I/0
  2. 沈向洋,被微软“耽搁”的独角兽催化大师
  3. SQL编程:模糊表关联不求人 --- concat + like就能行
  4. Dogleg“狗腿”最优化算法
  5. pythonfor循环案例教程_python开发之for循环操作实例详解,pythonfor实例详解
  6. spark | scala | 线性代数库Breeze学习
  7. TFS命令tf:undo(强制签入签出文件)
  8. node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第1部分)| Node.js
  9. SQL Server 2022 DataSheet
  10. java反序列化时区,Jackson使用Java 8将Elasticsearch反序列化为LocalDateTime
  11. 欧亚马 java折叠车_如何选择欧亚马折叠车?
  12. 菜鸟学Linux 第026篇笔记 LVM
  13. Python计算IV值
  14. Flixel框架介绍一
  15. 文档管理系统OnlyOffice在线编辑功能
  16. 深度剖析 Vue3 如何通过虚拟DOM更新页面
  17. 大学计算机软件专业生应该学什么
  18. OpenStack又有大变化?基金会官方一张图秒懂
  19. css文字换行时对不齐,css小技巧 - 换行对齐
  20. 计算机在医学影像学中有哪些应用,计算机辅助教学在医学影像学实习课中的应用...

热门文章

  1. 51单片机实现电机控制和LCD显示
  2. 【Kubernetes 系列】一文带你吃透 K8S 应用pod结点
  3. Java PDF数字签名(一) - 添加数字签名
  4. 使用cpolar发布群晖NAS上的网页 上篇(7.X版)
  5. vue3运行npm run serve无反应,选择跳转后会自动跳入文件路径中
  6. 九州量子黄蕾蕾:我们是冲着量子通信产业化来的
  7. 《白帽子讲Web安全》浏览器安全
  8. RHCE-RHEL 7 系统简介
  9. QList使用注意(浅拷贝 深拷贝)
  10. BIOS没有开启虚拟化问题disabled by bios