利用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

执行结果

Sql Server Sum函数的特殊使用的更多相关文章

  1. sql server sum函数

    sum()函数 --SUM 函数返回数值列的总数 语法:SELECT SUM(column_name) FROM table_name

  2. SQL Server 聚合函数算法优化技巧

    Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值 ...

  3. 数据库开发基础-SQl Server 聚合函数、数学函数、字符串函数、时间日期函数

    SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function(列) FROM 表 函数的类型 在 SQL 中,基本的函数类型和种类有若干种.函 ...

  4. 13、SQL Server 自定义函数

    SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值 ...

  5. sql server自定义函数学习笔记

    sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...

  6. Oracle 与Sql Server常用函数对比

    来自:http://topic.csdn.net/u/20080704/08/b2b8c42f-b0d6-4cda-98b1-6e4a279b4ff8.html 感谢楼主 函数 SQLServer和O ...

  7. 也来谈谈SQL SERVER 自定义函数~

    在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...

  8. SQL Server排序函数row_number和rank的区别

    SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...

  9. SQL SERVER 2008函数大全(含例子)

    --SQL SERVER 2008 函数大全 /* author:TracyLee csdncount:Travylee */ /* 一.字符串函数: 1.ascii(字符串表达式)    返回字符串 ...

随机推荐

  1. flask实现分类搜索的小测试

    最新学长要求实现一个搜索的功能呢,也费了一点功夫.这个案例也没有学长写的好,比学长的实现差了不少,待我仔细研究习再发出相应代码 项目要求,搜索语法如下: titile: xxx #搜索titile的所 ...

  2. 添加和读取Resources嵌入资源文件(例如.dll和.ssk文件)

    前言:有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合 ...

  3. 题解-洛谷P7114 字符串匹配

    题面 洛谷P7114 字符串匹配 \(T\) 组测试数据.给定字符串 \(S\),问有多少不同的非空字符串 \(A\),\(B\),\(C\) 满足 \(S=ABABAB...ABC\) 且 \(A\ ...

  4. 【题解】「AT4266」[ABC113B] Palace

    AT4266 [ABC113B] Palace 水题解*n translation 有 \(n\) 个地方,第 \(i\) 个地方的海拔为 \(H_i\),该地方的温度为 \(T-H_i \times ...

  5. CSP-S2020复赛游记

    [本文经过删改] 前一个月 没做什么 NOIP 的题,感觉这些题对我这个做黄题封顶的人不是很友好. 前一天 考了场模拟赛,全场最低分 89,感觉信心满满. 退役那天 到了 XJ,发现没人可以面基,想着 ...

  6. 题解-CF1396C Monster Invaders

    题面 CF1396C Monster Invaders 有 \(n\) 层关卡,每层有 \(a_i\) 个小怪(\(1\) 血)和 \(1\) 个老怪(\(2\) 血).有三种武器:\(1\) 武器每 ...

  7. CSP-S2020 浙江 游记

    2020.10.9 今天是 \(2020\) 年 \(10\) 月 \(9\) 日,距离初赛还有两天(算两天吗,完整的应该只有一天多了). 原本对于比赛还是没什么感觉的,每天做做题,水水文章,感觉时间 ...

  8. 20分钟带你掌握JavaScript Promise和 Async/Await

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.freecodecamp.org/news/learn-promise-a ...

  9. 【Tomcat 源码系列】源码构建 Tomcat

    一,前言 这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地.最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间 ...

  10. ubuntu20.04 LTS 更换国内163源、阿里源、清华源、中科大源

    Ubuntu 20.04 是 Ubuntu 的第 8 个 LTS 版本,其重大更新和改进将在 2030 年前终止,计划于2020年 4 月 23 日发布. 国内有很多Ubuntu的镜像源,有阿里的.网 ...