下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當(dāng)前位置:軟件下載吧 > 數(shù)據(jù)庫 > MS_SQL > SQL基礎(chǔ):sql?server?累計(jì)求和實(shí)現(xiàn)代碼

          SQL基礎(chǔ):sql?server?累計(jì)求和實(shí)現(xiàn)代碼

          時(shí)間:2024-02-09 10:40作者:下載吧人氣:23

          看了一眼自關(guān)聯(lián),沒搞懂,試了一下也沒成功。

          over方式一下結(jié)果就出來了,好用。

          /*
          需求:累計(jì)求和六種算法效率比較
          作者:felix
          日期:2020-06-23

          */
          –第一步,準(zhǔn)備測試數(shù)據(jù)
          –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;
          —-第二步,創(chuàng)建記錄時(shí)間的表格
          –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,–開始時(shí)間
          — et DATETIME2,–結(jié)束時(shí)間
          — idiff AS DATEDIFF(ms, bt, et)–所用的毫秒數(shù)
          –第一種方法,自連接法,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);
          –第四種,相關(guān)子查詢,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 –內(nèi)部查詢
          FROM dbo.t AS outquery;
          (‘相關(guān)子查詢’, @bt, @et);
          –ORDER BY outquery.i; –外部查詢
          –游標(biāo)方法,有兩種方法可以實(shí)現(xiàn),一種是臨時(shí)表更新,一種是變量疊加更新,157255661.40
          –先增加一個(gè)存儲(chǔ)累計(jì)和的列
          –第5種,游標(biāo)_臨時(shí)表更新
          –ALTER TABLE dbo.t ADD total_d MONEY DEFAULT (0);–只運(yùn)行一次
          DECLARE @t TABLE –定義表變量,存儲(chǔ)累計(jì)求和臨時(shí)結(jié)果
          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;
          (‘游標(biāo)_臨時(shí)表更新’, @bt, @et);
          –第6種,游標(biāo)_變量疊加更新
          DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t; –ORDER BY i;
          UPDATE dbo.t
          SET total_d = @total_d
          WHERE i = @i;
          (‘游標(biāo)_變量疊加更新’, @bt, @et);
          –執(zhí)行時(shí)間 over子句<游標(biāo)臨時(shí)表更新<游標(biāo)變量疊加更新<自連接<相關(guān)子查詢<遞歸查詢

          標(biāo)簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫,SQLSERVER

          相關(guān)下載

          查看所有評(píng)論+

          網(wǎng)友評(píng)論

          網(wǎng)友
          您的評(píng)論需要經(jīng)過審核才能顯示

          熱門閱覽

          最新排行

          公眾號(hào)

          主站蜘蛛池模板: 变态调教一区二区三区| 丰满人妻一区二区三区视频53| 国产无套精品一区二区| 成人久久精品一区二区三区| 精品国产亚洲一区二区三区| 日本一区二区三区在线视频 | 国产亚洲一区二区三区在线| 无码人妻aⅴ一区二区三区有奶水| 久久免费精品一区二区| 日韩经典精品无码一区| 精品欧美一区二区在线观看| 交换国产精品视频一区| 99精品一区二区免费视频| 精品国产免费一区二区三区香蕉| 国产日韩AV免费无码一区二区三区| 国产一区二区三区无码免费| 国产av一区最新精品| 亚洲AV日韩综合一区| 午夜性色一区二区三区免费不卡视频| 无码人妻AⅤ一区二区三区| 亚洲无线码在线一区观看| 成人无码AV一区二区| 亚洲乱色熟女一区二区三区丝袜 | 99精品国产一区二区三区2021 | 精品视频一区二区三区在线播放| 无码aⅴ精品一区二区三区浪潮 | 一色一伦一区二区三区| 日韩欧国产精品一区综合无码| 国精产品一区一区三区| 无码囯产精品一区二区免费| 精品日韩亚洲AV无码一区二区三区 | 亚洲一区二区三区乱码在线欧洲| 亚洲综合在线成人一区| 蜜桃传媒一区二区亚洲AV| 国产亚洲综合精品一区二区三区| 动漫精品第一区二区三区| 在线精品国产一区二区三区| 美女啪啪一区二区三区| 国产精品香蕉一区二区三区| 国产一区二区三区不卡在线看| 国产精品一区12p|