时间:2021-05-02
前言
未来的一个月时间中,会总结一系列SQL知识点,一次只总结一个知识点,尽量说明白,下面来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)
让我们先从一个虚构的场景中来着手吧
万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIncome 表
? 1 2 3 4 5 create table DailyIncome(VendorId nvarchar(10), IncomeDay nvarchar(10), IncomeAmount int) --VendorId 供应商ID, --IncomeDay 收入时间 --IncomeAmount 收入金额紧接着来插入数据看看
(留意看下,有的供应商某天中会有多次收入,应该是分批进账的)
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 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)让我们先来看看前十行数据:
? 1 select top 10 * from DailyIncome如图所示:
DailyIncome
虽然数据是能够完全给展示了,但好像一眼望去不能得到对我们用处更大的信息,比如说我们想得到每个供应商的每天的总收入,这时我们应该做一些数据形式的转变了,平常的所用的是这样的。
? 1 2 3 4 5 6 7 8 9 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函数进行行转列试下。
? 1 2 3 4 5 6 select * from DailyIncome ----第一步 pivot ( sum (IncomeAmount) ----第三步 for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步 ) as AvgIncomePerDay来解释下,要想用好Pivot函数,应该理解代码注释中的这几步。
第一步:肯定是要明白数据源了,这里是DailyIncome
第二步:要明白要想让哪一列的值做新的列名字
第三步:要明白对于这新的列要求那些值呢?
下面有个练习题目,做之前不要看答案啊
问:对于SPIKE这家供应商来说,每天最大的入账金额。
? 1 2 3 select * from DailyIncome pivot (max (IncomeAmount) for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])) as MaxIncomePerDay where VendorId in ('SPIKE')参考链接如下:
1.Pivot tables in SQL Server. A simple sample
2.行转列:SQL SERVER PIVOT与用法解释
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/8f929264995e
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Kotlin基础教程之函数定义与变量声明可以看到,函数定义就是{函数体}单语句函数可以简写,比如add函数和add1函数效果是一样的变量定义var:=常量定义v
前言在学习SQL2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQLServer2012T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄
本文实例讲述了Python基础教程之内置函数locals()和globals()用法。分享给大家供大家参考,具体如下:1.这两个函数主要提供,基于字典的访问局部
前言这是总结SQL知识点的第二篇文章,一次只总结一个知识点,尽量说明白。上次我们谈到行转列,用的是Pivot函数,这次我们来谈谈Unpivot函数。(这里是用的
基础教程介绍了基本概念,特别是对象和类。进阶教程对基础教程的进一步拓展,说明Python的细节。希望在进阶教程之后,你对Python有一个更全面的认识。之前我们