一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - sql server 累計求和實現代碼

sql server 累計求和實現代碼

2022-02-25 17:26單純的桃子 Sql Server

這篇文章主要介紹了sql server 累計求和的實現代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

看了一眼自關聯,沒搞懂,試了一下也沒成功。

over方式一下結果就出來了,好用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
需求:累計求和六種算法效率比較
作者: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.

?
1
2
3
4
5
6
7
8
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.

?
1
2
3
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 累計求和內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/luna-hehe/p/15935342.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清在线播放 | 污文啊好棒棒啊好了 | 99久久精品国产免看国产一区 | jizzjizz大学生 | 99久久精品自在自看国产 | 日本激情网站 | a4yy欧美一区二区三区 | wankz视频| 国产一卡2卡3卡4卡公司科普 | 无人区国产大片 | 午夜影视在线观看 | dyav午夜片| 国产精品久久久久jk制服 | 99在线在线视频免费视频观看 | 8天堂资源在线官网 | 欧美日韩在线观看精品 | 午夜在线观看免费完整直播网页 | 暖暖影院日本版 | 国产一区二区三区欧美精品 | 国产精品成人免费福利 | 亚洲久草视频 | 亚洲成色www久久网站 | 亚洲v成人天堂影视 | 亚洲 综合 欧美在线视频 | 欧美贵妇videos办公室360 | 操碰免费视频 | 性bbwbbwbbwbbw撒尿| 草嫩社区 | 美女被到爽流动漫 | 欧美亚洲韩国 | 性色AV一区二区三区V视界影院 | 精品综合久久久久久97超人 | 午夜久久久久久亚洲国产精品 | 色啪久久婷婷综合激情 | 欧美添下面视频免费观看 | 国产欧美成人免费观看 | 艾秋麻豆果冻传媒老狼仙踪林 | 美女被狂揉下部羞羞动漫 | 日韩免费高清完整版 | 日本高清中文字幕一区二区三区 | 成人久久久|