SQL基础教程之行转列Pivot函数
时间:2019-12-04来源:系统城作者:电脑系统城
前言
未来的一个月时间中,会总结一系列SQL知识点,一次只总结一个知识点,尽量说明白,下面来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)
让我们先从一个虚构的场景中来着手吧
万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIncome 表
- create table DailyIncome(VendorId nvarchar(10), IncomeDay nvarchar(10), IncomeAmountint)
-
- --VendorId 供应商ID,
- --IncomeDay 收入时间
- --IncomeAmount 收入金额
紧接着来插入数据看看
(留意看下,有的供应商某天中会有多次收入,应该是分批进账的)
- 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)
让我们先来看看前十行数据:
- 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函数进行行转列试下。
- select * from DailyIncome ----第一步
- pivot
- (
- sum (IncomeAmount) ----第三步
- for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步
- ) as AvgIncomePerDay
来解释下,要想用好Pivot函数,应该理解代码注释中的这几步。
第一步:肯定是要明白数据源了,这里是DailyIncome
第二步:要明白要想让哪一列的值做新的列名字
第三步:要明白对于这新的列要求那些值呢?
下面有个练习题目,做之前不要看答案啊
问:对于SPIKE这家供应商来说,每天最大的入账金额。
- 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与用法解释
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
相关信息
-
-
高版本Mysql使用group by分组报错的解决方案
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组,下面这篇文章主要给大家介绍了关于高版本Mysql使用group by分组报错的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下...
2023-03-06