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

网络编程 2021-07-05 16:49www.168986.cn编程入门
这篇文章主要给大家介绍了关于SQL基础教程之行转列Pivot函数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL具有一定的参考学习价值,需要的朋友们狼蚁网站SEO优化来一起学习学习吧

前言

未来的一个月时间中,会一系列SQL知识点,一次只一个知识点,尽量说明白,狼蚁网站SEO优化来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)

让我们先从一个虚构的场景中来着手吧

万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIne 表

create table DailyIne(VendorId nvarchar(10), IneDay nvarchar(10), IneAmount int)

--VendorId 供应商ID,
--IneDay 收入时间
--IneAmount 收入金额

紧接着来插入数据看看

(留意看下,有的供应商某天中会有多次收入,应该是分批进账的)

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

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

select  10  from DailyIne

如图所示


DailyIne

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

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

得到如下的结果


case when结果

如果大家仔细看结果的话,会有这样的发现,这是把VendorID进行了分组,并且对于每组中IneDay这一列中的值都变成了新的列名字,然后对IneAmount进行求和操作。

这样写可能是有些麻烦,别着急,我们用Pivot函数进行行转列试下。

select  from DailyIne ----第一步
pivot 
(
sum (IneAmount) ----第三步
for IneDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步
) as AvgInePerDay

来解释下,要想用好Pivot函数,应该理解代码注释中的这几步。

第一步肯定是要明白数据源了,这里是DailyIne

第二步要明白要想让哪一列的值做新的列名字

第三步要明白对于这新的列要求那些值呢?

狼蚁网站SEO优化有个练习题目,做之前不要看答案啊

问对于SPIKE这家供应商来说,每天最大的入账金额。

select  from DailyIne
pivot (max (IneAmount) for IneDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])) as MaxInePerDay
where VendorId in ('SPIKE')

参考链接如下

1.

2.

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对狼蚁SEO的支持。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by