1.简介:
@H_403_2@sql Server 2005中的窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地累计总数、移动平均值、以及执行其它计算。 @H_403_2@窗口函数功能非常强大,使用起来也十分容易。可以使用这个技巧立即得到大量统计值。 @H_403_2@窗口是用户指定的一组行。 开窗函数计算从窗口派生的结果集中各行的值。 @H_403_2@2.适用范围: @H_403_2@
排名开窗函数和聚合开窗函数. @H_403_2@也就是说窗口函数是结合排名开窗函数或者聚合开窗函数一起使用 @H_403_2@OVER子句前面必须是排名函数或者是聚合函数3.例题:
@H_403_2@ 代码如下:
403_2@--建立订单表 @H_403_2@create table SalesOrder( @H_403_2@OrderID int,--订单id @H_403_2@OrderQty decimal(18,2) --数量 @H_403_2@) @H_403_2@go @H_403_2@--插入数据 @H_403_2@insert into SalesOrder @H_403_2@select 1,2.0 @H_403_2@union all @H_403_2@select 1,1.0 @H_403_2@union all @H_403_2@select 1,3.0 @H_403_2@union all @H_403_2@select 2,6.0 @H_403_2@union all @H_403_2@select 2,1.1 @H_403_2@union all @H_403_2@select 3,8.0 @H_403_2@union all @H_403_2@select 3,7.0 @H_403_2@go @H_403_2@--查询得如下结果 @H_403_2@select * from SalesOrder @H_403_2@go @H_403_2@OrderID OrderQty @H_403_2@----------- ------------ @H_403_2@1 2.00 @H_403_2@1 1.00 @H_403_2@1 3.00 @H_403_2@2 6.00 @H_403_2@2 1.10 @H_403_2@3 8.00 @H_403_2@3 1.10 @H_403_2@3 7.00 @H_403_2@
@H_403_2@现要求显示汇总总数,每当所占比例,分组汇总数,每单在各组所占比例,要求格式如下: @H_403_2@OrderID OrderQty 汇总 每单比例 分组汇总 每单在各组比例 @H_403_2@1 2.00 29.20 0.0685 6.00 0.3333 @H_403_2@1 1.00 29.20 0.0342 6.00 0.1667 @H_403_2@1 3.00 29.20 0.1027 6.00 0.5000 @H_403_2@2 6.00 29.20 0.2055 7.10 0.8451 @H_403_2@2 1.10 29.20 0.0377 7.10 0.1549 @H_403_2@3 8.00 29.20 0.2740 16.10 0.4969 @H_403_2@3 1.10 29.20 0.0377 16.10 0.0683 @H_403_2@3 7.00 29.20 0.2397 16.10 0.4348 @H_403_2@ 代码如下:
403_2@--利用窗口函数和聚合开窗函数,可以很快实现上述要求 @H_403_2@select OrderID,OrderQty,@H_403_2@sum(OrderQty) over() as [汇总],@H_403_2@convert(decimal(18,4),OrderQty/sum(OrderQty) over() ) as [每单所占比例],@H_403_2@sum(OrderQty) over(PARTITION BY OrderID) as [分组汇总],OrderQty/sum(OrderQty) over(PARTITION BY OrderID)) as [每单在各组所占比例] @H_403_2@from SalesOrder @H_403_2@order by OrderID @H_403_2@
@H_403_2@窗口函数是sql2005新增加的,下面我们看看在sql2000里面怎么实现上述的结果: @H_403_2@sql2000的实现步骤较麻烦,先计算出总数,再分组计算汇总,最后连接得到结果 @H_403_2@ 代码如下:
403_2@--sql2000 @H_403_2@declare @sum decimal(18,2) @H_403_2@select @sum=sum(OrderQty) @H_403_2@from SalesOrder @H_403_2@--按OrderID,计算每组的总计,然后插入临时表 @H_403_2@select OrderID,sum(OrderQty) as su @H_403_2@into #t @H_403_2@from SalesOrder @H_403_2@group by OrderID @H_403_2@--连接临时表,得到结果 @H_403_2@select s.OrderID,s.OrderQty,@H_403_2@@sum as [汇总],s.OrderQty/@sum) as [每单所占比例],@H_403_2@t.su as [分组汇总],s.OrderQty/t.su) as [每单在各组所占比例] @H_403_2@from SalesOrder s join #t t @H_403_2@on t.OrderID=s.OrderID @H_403_2@order by s.OrderID @H_403_2@drop table #t @H_403_2@go @H_403_2@
@H_403_2@上面演示的都是窗口函数与聚合开窗函数的使用,它与排名开窗函数请看下面例题: @H_403_2@ 代码如下:
403_2@--与排名开窗函数使用 @H_403_2@select OrderID,@H_403_2@rank() over(PARTITION BY orderid order by OrderQty ) as [分组排名],@H_403_2@rank() over(order by OrderQty ) as [排名] @H_403_2@from SalesOrder @H_403_2@order by orderid asc @H_403_2@--查询得如下结果 @H_403_2@OrderID OrderQty 分组排名 排名 @H_403_2@1 2.00 2 4 @H_403_2@1 3.00 3 5 @H_403_2@1 1.00 1 1 @H_403_2@2 1.10 1 2 @H_403_2@2 6.00 2 6 @H_403_2@3 7.00 2 7 @H_403_2@3 8.00 3 8 @H_403_2@3 1.10 1 2 @H_403_2@
原文链接:https://www.f2er.com/mssql/66434.html