Sql Server2005 Transact-SQL 窗口函数(OVER)

2023-10-05 22:31

本文主要是介绍Sql Server2005 Transact-SQL 窗口函数(OVER),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简介:
SQL Server 2005中的窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地累计总数、移动平均值、以及执行其它计算。
窗口函数功能非常强大,使用起来也十分容易。可以使用这个技巧立即得到大量统计值。
窗口是用户指定的一组行。 开窗函数计算从窗口派生的结果集中各行的值。

2.适用范围:
排名开窗函数和聚合开窗函数.
也就是说窗口函数是结合排名开窗函数或者聚合开窗函数一起使用
OVER子句前面必须是排名函数或者是聚合函数

3.例题:

-- 建立订单表
create   table  SalesOrder(
OrderID 
int ,             -- 订单id
OrderQty  decimal ( 18 , 2 )   -- 数量
)
go

-- 插入数据
insert   into  SalesOrder
select   1 , 2.0
union   all
select   1 , 1.0
union   all
select   1 , 3.0
union   all
select   2 , 6.0
union   all
select   2 , 1.1
union   all
select   3 , 8.0
union   all
select   3 , 1.1
union   all
select   3 , 7.0
go

-- 查询得如下结果
select   *   from  SalesOrder
go

OrderID     OrderQty
-- --------- ------------
1             2.00
1             1.00
1             3.00
2             6.00
2             1.10
3             8.00
3             1.10
3             7.00



现要求显示汇总总数,每当所占比例,分组汇总数,每单在各组所占比例,要求格式如下:

OrderID OrderQty 汇总     每单比例 分组汇总 每单在各组比例
1            2.00     29.20        0.0685      6.00           0.3333
1            1.00     29.20        0.0342      6.00           0.1667
1            3.00     29.20        0.1027      6.00           0.5000
2            6.00     29.20        0.2055      7.10           0.8451
2            1.10     29.20        0.0377      7.10           0.1549
3            8.00     29.20        0.2740      16.10         0.4969
3            1.10     29.20        0.0377      16.10         0.0683
3            7.00     29.20        0.2397      16.10         0.4348


-- 利用窗口函数和聚合开窗函数,可以很快实现上述要求
select  OrderID,OrderQty,
sum (OrderQty)  over ()  as   [ 汇总 ] ,
convert ( decimal ( 18 , 4 ), OrderQty / sum (OrderQty)  over () )  as   [ 每单所占比例 ] ,
sum (OrderQty)  over (PARTITION  BY  OrderID)   as   [ 分组汇总 ] ,
convert ( decimal ( 18 , 4 ),OrderQty / sum (OrderQty)  over (PARTITION  BY  OrderID))  as   [ 每单在各组所占比例 ]
from  SalesOrder
order   by  OrderID


窗口函数是sql2005新增加的,下面我们看看在sql2000里面怎么实现上述的结果:
sql2000的实现步骤较麻烦,先计算出总数,再分组计算汇总,最后连接得到结果

-- sql2000
declare   @sum   decimal ( 18 , 2 )
select   @sum = sum (OrderQty) 
from  SalesOrder

-- 按OrderID,计算每组的总计,然后插入临时表
select  OrderID, sum (OrderQty)  as  su
into  #t
from  SalesOrder
group   by  OrderID

-- 连接临时表,得到结果
select  s.OrderID,s.OrderQty,
    
@sum   as   [ 汇总 ] ,
    
convert ( decimal ( 18 , 4 ),s.OrderQty / @sum as   [ 每单所占比例 ] ,
    t.su  
as   [ 分组汇总 ] ,
    
convert ( decimal ( 18 , 4 ),s.OrderQty / t.su)  as   [ 每单在各组所占比例 ]
from  SalesOrder s  join  #t t
on  t.OrderID = s.OrderID
order   by  s.OrderID

drop   table  #t
go
 
 
Source:http://www.cnblogs.com/aierong/archive/2008/08/26/1273890.html

这篇关于Sql Server2005 Transact-SQL 窗口函数(OVER)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152176

相关文章

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用