这篇文章将为大家详细讲解有关SQL中如何实现行转列Pivot函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

先来创建一个DailyIncome 表

createtableDailyIncome(VendorIdnvarchar(10),IncomeDaynvarchar(10),IncomeAmountint)--VendorId供应商ID,--IncomeDay收入时间--IncomeAmount收入金额

紧接着来插入数据看看

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

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

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

selecttop10*fromDailyIncome

如图所示:


DailyIncome

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

selectVendorId,sum(casewhenIncomeDay='MoN'thenIncomeAmountelse0end)MON,sum(casewhenIncomeDay='TUE'thenIncomeAmountelse0end)TUE,sum(casewhenIncomeDay='WED'thenIncomeAmountelse0end)WED,sum(casewhenIncomeDay='THU'thenIncomeAmountelse0end)THU,sum(casewhenIncomeDay='FRI'thenIncomeAmountelse0end)FRI,sum(casewhenIncomeDay='SAT'thenIncomeAmountelse0end)SAT,sum(casewhenIncomeDay='SUN'thenIncomeAmountelse0end)SUNfromDailyIncomegroupbyVendorId

得到如下的结果:


case when结果

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

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

select*fromDailyIncome----第一步pivot(sum(IncomeAmount)----第三步forIncomeDayin([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])---第二步)asAvgIncomePerDay

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

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

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

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

下面有个练习题目,做之前不要看答案啊

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

select*fromDailyIncomepivot(max(IncomeAmount)forIncomeDayin([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]))asMaxIncomePerDaywhereVendorIdin('SPIKE')

关于“SQL中如何实现行转列Pivot函数”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。