gpt4 book ai didi

SQL基础教程之行转列Pivot函数

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章SQL基础教程之行转列Pivot函数由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

未来的一个月时间中,会总结一系列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

如图所示:

SQL基础教程之行转列Pivot函数

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

得到如下的结果:

SQL基础教程之行转列Pivot函数

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 。

最后此篇关于SQL基础教程之行转列Pivot函数的文章就讲到这里了,如果你想了解更多关于SQL基础教程之行转列Pivot函数的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com