时间:2019-11-30来源:电脑系统城作者:电脑系统城
前言
未来的一个月时间中,会总结一系列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
虽然数据是能够完全给展示了,但好像一眼望去不能得到对我们用处更大的信息,比如说我们想得到每个供应商的每天的总收入,这时我们应该做一些数据形式的转变了,平常的所用的是这样的。
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 |
第一步:肯定是要明白数据源了,这里是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' ) |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。
2023-03-15
Navicat远程连接MongoDB最全实现方法以及报错解决2023-03-15
MongoDB的启动方法详细总结2023-03-11
详解分库分表后非分片键如何查询GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组,下面这篇文章主要给大家介绍了关于高版本Mysql使用group by分组报错的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下...
2023-03-06