iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Sql Server Sum函数的特殊使用
  • 952
分享到

Sql Server Sum函数的特殊使用

SqlServerSum函数的特殊使用 2020-03-27 01:03:23 952人浏览 猪猪侠
摘要

利用SQL Server的Sum函数开窗得到累计值 具体详解https://www.cnblogs.com/zhaoshujie/p/9594676.html   个人示例例子  DECLARE @Sale Table (--年

Sql Server Sum函数的特殊使用

利用SQL Server的Sum函数开窗得到累计值

具体详解https://www.cnblogs.com/zhaoshujie/p/9594676.html

 

个人示例例子 

DECLARE @Sale Table
(--年份			月份			销售总额
  [Year]  INT,  [Month] INT,  TotalSales Float		
)
insert  INTO @Sale
SELECT  2016,	1,	100 UNION ALL SELECT  2016,	2,	200 UNioN ALL
SELECT  2016,	3,	300 UNION ALL SELECT  2016,	4,	400 UNION ALL
SELECT  2016,	5,	500 UNION ALL SELECT  2016,	6,	600 UNION ALL
SELECT  2016,	7,	650 UNION ALL SELECT  2016,	8,	500 UNION ALL
SELECT  2016,	9,	450 UNION ALL SELECT  2016,	10,	400 UNION ALL
SELECT  2016,	11,	300 UNION ALL SELECT  2016,	12,	400 UNION ALL
SELECT  2017,	1,	500 UNION ALL SELECT  2017,	2,	400 UNION ALL
SELECT  2017,	3,	500 UNION ALL SELECT  2017,	4,	400 UNION ALL
SELECT  2017,	5,	500 UNION ALL SELECT  2017,	6,	400 UNION ALL
SELECT  2017,	7,	500 UNION ALL SELECT  2017,	8,	400 UNION ALL
SELECT  2017,	9,	500 UNION ALL SELECT  2017,	10,	400 UNION ALL
SELECT  2017,	11,	500 UNION ALL SELECT  2017,	11,	400;	--注意2017有2条11月份重复数据
select [YEAR], [Month], TotalSales, 
	SUM(TotalSales)over() as [16-17销售总额],		
	--将所有的记录的TotalSales加起来的总和
	--100+200+300+400+500+600+650+500+450+400+300+400+500+400+500+400+500+400+500+400+500+400+500+400 = 10200
	

	--【未使用 partition by 指定分区示例】-------------------------------------------------------------
	sum(TotalSales) over(order by [YEAR]) [列1],
	--按照Year排序,计算同Year的总值与前面排序的总值之和,等同于[列3]
	sum(TotalSales) over(order by [YEAR],[Month]) [列2],
	--按照Year,Month排序,计算同Year,Month的总值与前面排序的总值之和,等同于[列4]
	sum(TotalSales) over(order by [YEAR] RANGE BETWEEN unbounded preceding AND CURRENT ROW) [列3],
	--RANGE BETWEEN unbounded preceding AND CURRENT ROW 表示指定取值范围为 当前行与当前行前面的所有行的值
	--	Year[2016]值为4800, Year[2017]值为其5400+TValue[2016]【4800】为10200
	sum(TotalSales) over(order by [YEAR],[Month] RANGE BETWEEN unbounded preceding AND CURRENT ROW) [列4],
	--按照Year,Month排序,累加当前行和前面所有行的值写入到同Year,Month中【注意,和列6中23,24的差异】
	sum(TotalSales) over(order by [YEAR] rows  BETWEEN unbounded preceding AND CURRENT ROW)[列5],
	--rows BETWEEN unbounded preceding AND CURRENT ROW  表示指定取值范围为 当前行与当前行前面的所有行的值。
	--按照Year排序,把当前行的值和前面所有行的值累加
	sum(TotalSales) over(order by [YEAR],[Month] rows  BETWEEN unbounded preceding AND CURRENT ROW)[列6],
	--按照Year,Month排序,当前行的值为  当前行和排序后前面所有的行的总值,【注意,和列4中 23,24行的差异】
	sum(TotalSales) over(order by [YEAR] rows BETWEEN 1 preceding AND 2 following) [列7],
	--rows BETWEEN 1 preceding AND 2 following 表示指定取值范围为 当前行与前一行和后两行的值
	--即第一行的值为:600=100+200+300  第二行的值为:1000=100+200+300+400  第三行的值为:1400=200+300+400+500
	sum(TotalSales) over(order by [YEAR] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) [列8],
	--ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 表示指定取值范围为 当前行与前一行的值
	--即第一行的值为:100=100  第二行的值为:300=100+200  第三行的值为:500=300+200


	--【使用 partition by 指定分区示例】--------------------------------------------------------------
	SUM(TotalSales)over(PARTITION BY [YEAR])[年销售额],
	--按照Year进行分区,将同Year的TotalSales累积并写入到同Year的行中
	--2016区间:100+200+300+400+500+600+650+500+450+400+300+400 = 4800
	--2017区间:500+400+500+400+500+400+500+400+500+400+500+400=5400
	SUM(TotalSales)over(PARTITION BY [YEAR],[Month])[月销售额],
	--按照Year,Month分区, Year,Month组成的只有1条数据,值为TotalSales

	sum(TotalSales) over(partition by [YEAR] order by [YEAR]) [列09],
	--按照Year分区,2016为1个区间,2017为1个区间, 按照Year排序, 当前行值为同Year的总值	--和前面Year的总值[没有前面Year]
	sum(TotalSales) over(partition by [YEAR] order by [YEAR],[Month]) [列10],
	--按照Year分区,2016为1个区间,2017为1个区间, 按照Year,Month排序排序,同Year,Month的值为[排序后前面同Year,Month的总值]加上[当前Year,Month的总值]

	sum(TotalSales) over(partition by [YEAR] order by [YEAR],[Month] RANGE BETWEEN unbounded preceding AND CURRENT ROW) [列11],
	--按照Year分区,2016为1个区间,2017为1个区间, 以[YEAR],[Month]排序, 同Year,Month的值为[排序后前面同Year,Month的总值]加上[当前Year,Month的总值]
	sum(TotalSales) over(partition by [YEAR] order by [YEAR],[Month] rows  BETWEEN unbounded preceding AND CURRENT ROW) [列12],
	--按照Year分区, 以[YEAR],[Month]排序,当前行的值为当前行和前面所有行的总值, 注意23,24行与列11的比较
	sum(TotalSales) over(partition by [YEAR] order by [YEAR],[Month] rows BETWEEN 1 preceding AND 2 following) [列13],
	--按照Year分区, 以[YEAR],[Month]排序,当前行的值为当前行前面1行到当前行后面2行的总值
	sum(TotalSales) over(partition by [YEAR] order by [YEAR],[Month] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) [列14]
	--按照Year分区, 以[YEAR],[Month]排序,当前行的值为当前行前面1行到当前行的值

	--ROWS与RANGE之间的区别看[列4]与[列5],[列11]与[列12]中第23,24的值差异
from @Sale

执行结果

 

您可能感兴趣的文档:

--结束END--

本文标题: Sql Server Sum函数的特殊使用

本文链接: https://www.lsjlt.com/news/6541.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-14
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-14
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-14
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-14
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-14
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-14
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-14
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-14
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作