sql server 累计求和实现代码


Posted in SQL Server onFebruary 28, 2022

看了一眼自关联,没搞懂,试了一下也没成功。

over方式一下结果就出来了,好用。

/*
需求:累计求和六种算法效率比较
作者:felix
日期:2020-06-23

*/
--第一步,准备测试数据
--IF OBJECT_ID(N'dbo.t') IS NOT NULL
--	DROP TABLE dbo.t;
--GO
--CREATE TABLE dbo.t
--(
--	i BIGINT IDENTITY(1, 1) PRIMARY KEY,
--	d MONEY
--);
--INSERT t
--	d
--)
--SELECT TOP 31465
--	   ROUND(10000 * RAND(CHECKSUM(NEWID())), 2)
--FROM sys.all_objects AS a
--	CROSS JOIN sys.all_objects;
----第二步,创建记录时间的表格
--IF OBJECT_ID(N'dbo.record_time') IS NOT NULL
--	DROP TABLE dbo.record_time;
--CREATE TABLE dbo.record_time
--	i INT IDENTITY PRIMARY KEY,
--	算法 NVARCHAR(10),
--	bt DATETIME2,--开始时间
--	et DATETIME2,--结束时间
--	idiff AS DATEDIFF(ms, bt, et)--所用的毫秒数
--第一种方法,自连接法,sql server 2008以上版本测试通过,157255661.40
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
GO
DECLARE @bt DATETIME2 = GETDATE();
SELECT a.i,
       a.d,
       SUM(b.d) AS total_sum
FROM dbo.t AS a
    INNER JOIN dbo.t AS b
        ON b.i <= a.i
GROUP BY a.i,
         a.d;
DECLARE @et DATETIME2 = GETDATE();
INSERT INTO dbo.record_time
(
    算法,
    bt,
    et
)
VALUES
('自连接', @bt, @et);
--ORDER BY a.i;
;
--第二种方法,递归,sql server 2008以上版本测试通过,157255661.40
WITH cte_total_sum
AS (SELECT i,
           d,
           d AS total_sum
    FROM dbo.t
    WHERE i = 1
    UNION ALL
    SELECT s.i,
           s.d,
           p.total_sum + s.d AS total_sum
    FROM dbo.t AS s
        INNER JOIN cte_total_sum AS p
            ON s.i - 1 = p.i)
SELECT *
FROM cte_total_sum
OPTION (MAXRECURSION 0);
('递归', @bt, @et);
--第三种方法,over 子句,sql server 2012测试通过,sql server 2008不支持,157255661.40
SELECT i,
       d,
       SUM(d) OVER (ORDER BY i) AS total_sum
FROM dbo.t;
('over子句', @bt, @et);
--第四种,相关子查询,sql server 2008以上版本测试通过,156625045.22
SELECT outquery.i,
       outquery.d,
       (
           SELECT SUM(innerq.d) FROM dbo.t AS innerq WHERE innerq.i <= outquery.i
       ) AS ct --内部查询
FROM dbo.t AS outquery;
('相关子查询', @bt, @et);
--ORDER BY outquery.i; --外部查询
--游标方法,有两种方法可以实现,一种是临时表更新,一种是变量叠加更新,157255661.40
--先增加一个存储累计和的列
--第5种,游标_临时表更新
--ALTER TABLE dbo.t ADD total_d MONEY DEFAULT (0);--只运行一次
DECLARE @t TABLE --定义表变量,存储累计求和临时结果
    i INT PRIMARY KEY IDENTITY,
    d MONEY,
    total_d MONEY
);
DECLARE @i INT = 0,
        @d MONEY = 0,
        @total_d MONEY = 0;
DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t ORDER BY i;
OPEN c1;
FETCH c1
INTO @i,
     @d;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @total_d += @d;
    INSERT INTO @t
    (
        d,
        total_d
    )
    VALUES
    (@d, @total_d);
    FETCH c1
    INTO @i,
         @d;
END;
CLOSE c1;
DEALLOCATE c1;
UPDATE dbo.t
SET total_d = b.total_d
    INNER JOIN @t AS b
        ON a.i = b.i;
('游标_临时表更新', @bt, @et);
--第6种,游标_变量叠加更新
DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t; --ORDER BY i;
    UPDATE dbo.t
    SET total_d = @total_d
    WHERE i = @i;
('游标_变量叠加更新', @bt, @et);
--执行时间 over子句<游标临时表更新<游标变量叠加更新<自连接<相关子查询<递归查询

补充:下面看下SQL server 累加求和

SQL server 累加求和

1.

SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg"
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count"
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min"
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max"
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);

2.

select SchSno,convert(varchar(10),a.Dates,120) Dates,
sum(Amt_avail) over(partition by SchSno order by convert(varchar(10),a.Dates,120)) as PeriodPreAmt
from jr_creditUserAcct a

到此这篇关于sql server 累计求和实现代码的文章就介绍到这了,更多相关sql server 累计求和内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
Sql-Server数据库单表查询 4.3实验课
Apr 05 SQL Server
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL SERVER触发器详解
Feb 24 #SQL Server
SQL SERVER存储过程用法详解
Feb 24 #SQL Server
SQL SERVER实现连接与合并查询
Feb 24 #SQL Server
SQLServer中exists和except用法介绍
SQL Server2019数据库备份与还原脚本,数据库可批量备份
SQL中的三种去重方法小结
Nov 01 #SQL Server
SQL Server表分区删除详情
You might like
PHP - Html Transfer Code
2006/10/09 PHP
php桌面中心(二) 数据库写入
2007/03/11 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
Python实现优先级队列结构的方法详解
2016/06/02 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
介绍Java的内部类
2012/10/27 面试题
经典演讲稿范文
2013/12/30 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
中式婚礼主持词
2014/03/13 职场文书
银行自荐信范文
2015/03/25 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
寻找成龙观后感
2015/06/12 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android