Sql Server Sum函数的特殊使用「建议收藏」

Sql Server Sum函数的特殊使用「建议收藏」利用Sql Server的Sum函数开窗得到累计值 具体详解https://www.cnblogs.com/zhaoshujie/p/9594676.html 个人示例例子 DECLARE @Sale

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

代码100分

执行结果

Sql Server Sum函数的特殊使用「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8016.html

(0)
上一篇 2023-03-09
下一篇 2023-03-09

相关推荐

  • 掌握Python 正则表达式中的特殊字符

    掌握Python 正则表达式中的特殊字符正则表达式是一种强大的文本模式匹配工具,常用于字符串的匹配、替换、分割等操作。Python内置re模块提供了丰富的正则表达式方法。但是,正则表达式中有许多特殊字符需要特殊处理,掌握这些特殊字符对于使用正则表达式是非常重要的。

    2023-12-13
    122
  • docker下安装openwrt_Docker安装

    docker下安装openwrt_Docker安装1:使用docker获取Redis镜像 docker pull redis(此处不加版本号表示拉取最新版本) 2:查看是否成功拉取Redis镜像 docker images 3:准本修改Redis配置

    2023-04-14
    164
  • Python divmod函数的用法

    Python divmod函数的用法Python divmod函数是一个非常有用的函数,它可以一次性地把除数和余数都求出来,同时还可以有效地减少代码量和时间效率。

    2024-08-07
    43
  • 非关系型数据库是指_非关系型数据库定义

    非关系型数据库是指_非关系型数据库定义NoSQL数据库的四大分类: 1.键值存储数据库(Key-Value) 相关产品:Redis 典型应用:内存缓存,主要用于处理大量数据的高访问负载 优势:快速查询 劣势:存储的数据缺少结构化 2.列…

    2023-02-18
    145
  • 禁用或启用数据库所有触发器的方法_数据库触发器类型

    禁用或启用数据库所有触发器的方法_数据库触发器类型禁用或启用数据库所有触发器。 禁用: use Test Exec sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER all" GO

    2022-12-29
    172
  • Python range函数的使用

    Python range函数的使用Python作为一门高级编程语言,在编写程序时,经常涉及到循环等必须要对序列进行操作的情况。Python中,有一个非常重要的函数——range函数,它具有非常广泛的应用。在本篇文章中,我们将对Python range函数的基本语法及应用进行详细介绍,帮助读者更好的理解和掌握这个函数。

    2024-05-09
    63
  • 利用Python快速获取字符串的长度

    利用Python快速获取字符串的长度字符串长度指的是字符串中字符的数量,通常以Unicode字符为计量单位。在Python中,我们可以使用len()函数来获取一个字符串的长度。

    2024-01-15
    116
  • 第三天MYSQL

    第三天MYSQL第三天MySQL学习 :分组函数、分组查询、连接查询(等值连接、非等值连接、自连接)

    2023-02-25
    139

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注