首页 > 数据库

SQL研究 - Pivot

时间:2009-06-09 14:11:44  作者:sadstory  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
在一个风和日丽的早上,老板从邮箱里发给你一个任务,希望你根据一个投资记录表做出一个统计。你匆匆跑到指定的数据库,发现结构如下的一张表:CREATE TABLE [dbo].[I......

在一个风和日丽的早上,老板从邮箱里发给你一个任务,希望你根据一个投资记录表做出一个统计。

你匆匆跑到指定的数据库,发现结构如下的一张表:

CREATE TABLE [dbo].[Investment](
[Investor] [nvarchar](256) NULL,
[Capital] [float] NULL,
[District] [nvarchar](256) NULL
)

你按照惯例看了下内容:select * from [dbo].[Investment]

得到如下结果:

Investor Capital District

IBM 1000000 Asia
IBM 150000 Europe
Oracle 800000 Asia
Oracle 180000 Europe
Microsoft 900000 Asia
Microsoft 180000 Europe

你的第一反应当然是:

select Investor, District,sum(Capital) from [dbo].[Investment] group by Investor, District

不过你很快发现,这样做根本没什么变化,而且也体现不出你的能力,嘿嘿,我们总是认为自己很有能力的。

的确,有个方法可以得到更酷的结果,那就是Pivot:

select Investor,[Asia],[Europe]
from

( select Investor,Capital,District from dbo.Investment ) x

pivot
( sum(Capital) for District in([Asia],[Europe]) ) as pvt

结果如下:

Investor Asia Europe

IBM 1000000 150000
Microsoft 900000 180000
Oracle 800000 180000

很酷吧。

现在来分析一下Pivot是怎样来得到这个结果的。

首先,Pivot的输入是什么,当然就是第三行的Select语句,请注意到,它的结果集包含3个列;

然后,Pivot把哪列转到列头上去,请注意第五行关键字For后的值:District;注意并不是把该列的所有值转到列头上,仅限于 IN 后被“()”包围的值。

细节:Asia和Europe出现了两次,第一行和第五行,含义并不相同,在第一行是作为列名,在第五行作为值。但是它们都被“[]”包围,而不是字符串常用的单引号,请不要忽略这一点。

最后,我们发现源表的Capital列消失了,新增加了Aisa和Europe列,那么新表中的表格单元值是什么呢? 是由第五行的聚合函数sum确定的,正如你所知道的那样,每个聚合函数都是在分组上工作的,此处的分组,即group by的目标是什么呢?

是源表中既没被删除,也没被转变的那一列:Investor。

最后,为了突出Pivot的好处,让我们看看如果没有Pivot,要想得到同样的结果,SQL是怎样的?

如果您需转载 SQL研究 - Pivot,请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门