前言
未来的一个月时间中,会总结一系列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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/8f929264995e