频道直达
八强网 > 实务 > 编程语言 > 正文阅读
关键词

探讨SQL Server 2005窗口函数

www.8tops.com 2007-10-13 11:37:02   发布:站长资讯
媒体:开发者在线  作者:开发者在线
 

SQL Server 2005中的窗口函数(window function)与微软Windows无关;相反,它们建立数据窗口。窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地恢复累计总数、移动平均值、以及执行其它计算。

一个SQL Server窗口是对函数应用的行的分区。你使用OVER(…)子句指定一个窗口,你可以对任何一个聚合函数应用这个子句。通常来说,你把数据分成几个组,但OVER()的自变量可选。

列表A说明如何一次搜集几个聚集,甚至根据聚合进行其它计算。这样就可得到列表B中的结果集。我把结果集限定为一个单独的OrderID,那么查询将只产生一个窗口。你可以用各种方式修改子句,如使用一个IN()子句列出一组特殊的顺序,或使用一个BETWEEN子句推导一个顺序范围内的统计值。最后你指定的每个OrderID都得到一个窗口。

窗口函数功能非常强大,建立起来也十分容易。你可以使用这个技巧立即搜索到大量统计值。这个教程中的例子指出,你可以在单独一个查询中搜索任何统计值集合。

列表A

USE AdventureWorks2;
GO
SELECT SalesOrderID, ProductID, OrderQty AS "Item Qty"
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Total Qty"
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Average Qty"
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Total Count"
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Minimum Count"
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Maximum Count"
      ,LineTotal
      ,AVG(LineTotal) OVER(PARTITION BY SalesOrderID) AS "Average Amount"
      ,SUM(LineTotal) OVER(PARTITION BY SalesOrderID) AS "Total Amount"
      ,(LineTotal/SUM(LineTotal) OVER(PARTITION BY SalesOrderID)) * 100 AS "Percent"
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = 43664
ORDER BY ProductID
GO
列表B43664 714   1     14    1     8     1     4     28.840400   3054.07610024432.608800      0.118000
43664 716   1     14    1     8     1     4     28.840400   3054.07610024432.608800      0.118000
43664 771   3     14    1     8     1     4     6119.9820003054.07610024432.608800      25.048400
43664 772   1     14    1     8     1     4     2039.9940003054.07610024432.608800      8.349400
43664 773   1     14    1     8     1     4     2039.9940003054.07610024432.608800      8.349400
43664 775   4     14    1     8     1     4     8099.9760003054.07610024432.608800      33.152300
43664 777   2     14    1     8     1     4     4049.9880003054.07610024432.608800      16.576100
43664 778   1     14    1     8     1     4     2024.9940003054.07610024432.608800      8.288000
document.body.oncopy = function () { setTimeout( function () { var text = clipboardData.getData("text"); if (text) { text = text + "\r\n本篇文章来源于 站长资讯网 原文链接:"+location.href; clipboardData.setData("text", text); } }, 100 ) }
八强网,更多精彩在首页,
八强网首页
网友评论

发表

游客于2008-5-26 16:53:45写道:
;批;
我也评两句
 
发文时请务必注意:
一、遵守国家相关法律规定,如 《北京地区互联网站电子公告服务倡议书》《全国人大常委会关于维护互联网安全的决定》 及中华人民共和国其他各项有关法律法规。一旦违犯法律法规,您将承担一切因您的行为而直接或间接导致的民事或刑事法律责任,本站工作人员有义务配合相关部门,提供必要的技术资料(如IP地址等)。
二、自觉遵守爱国、守法、自律、真实、文明的原则,严禁发表有人身攻击倾向、有造谣生事嫌疑的言论,严禁发表虚假广告、色情、网络传销性质的内容,本站管理人员有权删除违反规定的内容或取消违规网友的发文权限甚至删除其ID。
互联网产业作家
网站提交】【八强自荐
将八强网设为首页 将八强网添加到收藏夹 将八强网推荐给朋友 网络实名、通用网址:八强网
关于我们 - 联系合作 - 广告服务 - 友情链接 - 支持单位 - 免责声明
基于E-file技术构建 版权所有Copyright©2006 京ICP备06061834号