旗下网站:中国民网专业虚拟主机域名注册中国主机托管网东莞电信最大主机托管
虚拟主机,主页空间,国际域名,asp空间,论坛空间,论坛主机,asp.net空间,主机租用,空间,网站空间,服务器租用,主机租用,服务器托管,主机托管,网页空间,网络空间 虚拟主机,主页空间,国际域名,asp空间,论坛空间,论坛主机,asp.net空间,主机租用,空间,网站空间,服务器租用,主机租用,服务器托管,主机托管,网页空间,网络空间 虚拟主机,主页空间,国际域名,asp空间,论坛空间,论坛主机,asp.net空间,主机租用,空间,网站空间,服务器租用,主机租用,服务器托管,主机托管,网页空间,网络空间
虚拟主机,主页空间,国际域名,asp空间,论坛空间,论坛主机,asp.net空间,主机租用,空间,网站空间,服务器租用,主机租用,服务器托管,主机托管,网页空间,网络空间
首 页 域名注册 虚拟主机 主机托管 网页设计 企业邮局 双线主机 代理申请 帮助中心 购物车
  返回首页
如何编写SQL Server 2005 PIVOT查询-数据库知识
          ★★★ 【字体:

PIVOT是新引入SQL Server 2005的运算符,它让你能够将行级数据旋转成为列表数据,而不需要像先前版本的SQL Server一样使用CASE语句。

CASE语句查询

对于数据库开发人员来说,将行级数据转换为列级数据并不是什么新东西。在SQL Server以前的版本里,要获得所需要的跨表格数据集就要用到一系列CASE语句和聚合查询。虽然这种方式让开发人员具有了对所返回数据进行高度控制的能力,但是编写出这些查询是一件很麻烦的事情。

为了看一下这些CASE语句是如何使用的。我们需要一些测试数据。运行列表A里的脚本能够创建一个SalesHistory表格并把数据加载到表格里。

现在我可以编写一个基于CASE语句的PIVOT查询。这个查询的目标是按照年份将每件产品的销售状况集中起来,这些产品包括:BigScreen、PoolTable和Computer。每件产品自己的销售数据都放在专用的列里。列表B里是CASE语句查询的脚本。

这个查询虽然很简单,相对容易编写,但是很繁复。你必须明确地为每个想要转换成列表数据的行输入一个CASE语句,这一点意思都没有。如果有个程序能够帮你自动完成这项任务就好了——这就是PIVOT运算符的作用之所在。

PIVOT

由于SQL Server 2005有了新的PIVOT运算符,就不再需要CASE语句和GROUP BY语句了。(每个PIVOT查询都涉及某种类型的聚合,因此你可以忽略GROUP BY语句。)PIVOT运算符让我们能够利用CASE语句查询实现相同的功能,但是你可以用更少的代码就实现,而且看起来更漂亮。列表C是一个示例PIVOT查询,它模仿的是我们的CASE语句查询。

这个查询的关键部分是PIVOT运算符后面的括号。在括号里面,我们使用一个SUM聚合函数计算用FOR Product IN()语句列出的每个Product的SalePrice总和。这个语句可能看起来有点别扭,因为IN()语句的值没有放在(')符号里,它们是文本值。这些值事实上被当作ColumnNames对待,它们在最终的结果集里被转换成列表字段。

如果你运行这个查询,得到的结果与我们从CASE语句查询获得的结果类似。但两者的一个重要不同之处是,这个查询仍然会为我们表格里列出的每个行返回一个行,这当然是不能令人满意的;我们希望获得一个直观的表格列表,列出每年的销售量。造成这种情况的问题在于我们一开始编写PIVOT查询的方式。

在这个查询的SELECT语句中,我们只是在SalesHistory列表里简单地列出了年,并为每个产品设定了一个字段。因此问题在于处理PIVOT语句的SELECT语句无法确定在PIVOT语句里要使用哪一个列。PIVOT语句将分组应用到了所有的列,后者既不是旋转字段也不是聚合字段。我们可以使用子查询来实现满意的结果。
不足之处

PIVOT运算符在很多情况下都很有用,然而它还有一些不足之处。PIVOT运算符所提供的很多功能都要求你对旋转成为列级数据的字段进行“硬编码”。你可以利用动态TSQL语句编写PIVOT查询来解决这一问题,但是这还不是最理想的解决办法。

使用PIVOT语句的另外一个潜在问题是你或许只能在结果集里聚合一个字段;而你利用CASE语句查询可以聚合任意多的字段。

虽然这些潜在不足之处似乎可能成为阻碍使用新PIVOT运算符的障碍,但是它在TSQL开发人员的工具箱里还是占有一席之地。

  • 上一篇帮助中心:

  • 下一篇帮助中心:
  • ASP空间 | 关于我们 | 新闻中心 | 合作伙伴 | 联系方式 | 网站地图 | 付款信息 | 机房环境 | 虚拟主机

    合作伙伴
     

    中国广东:东莞市南城区国际商会大厦3A09 销售专线:0769 - 86215755 85795999 22772907 本站3721网络实名:网页空间
    主机托管咨询电话:0769-85795999 夜间值班电话:13712017908 传真:0769-86215756

    版权所有:中国民网 严禁复制 工商注册号:4419002009137 粤ICP备05127709号