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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C