首頁 > 資料庫 > mysql教程 > 如何在SQL Server中有效計算運行總計?

如何在SQL Server中有效計算運行總計?

Linda Hamilton
發布: 2025-01-25 03:22:14
原創
292 人瀏覽過

How to Efficiently Calculate Running Totals in SQL Server?

在SQL Server中計算運行總計

簡介

計算運行總計是數據分析中的一項常見任務。在SQL Server中,有多種方法可以實現此目標,包括使用窗口函數、相關子查詢和基於游標的解決方案。 “聚合集語句技巧”是一種引發討論的方法。此技術涉及將行插入到具有空運行總計的臨時表中,按特定順序更新表,最後選擇更新的運行總計。

聚合集語句技巧

以下查詢使用聚合集語句技巧來計算運行總計:

<code class="language-sql">INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal) 
SELECT id, somedate, somevalue, null
FROM TestTable
ORDER BY somedate

DECLARE @RunningTotal int
SET @RunningTotal = 0

UPDATE @AnotherTbl
SET @RunningTotal = runningtotal = @RunningTotal + somevalue
FROM @AnotherTbl</code>
登入後複製

這種方法被認為是高效的,因為它按檢索到的順序更新行。但是,人們對其在所有場景中的可靠性表示擔憂。

聚合集語句技巧的替代方法

1. 窗口函數:

SQL Server 2012引入了OVER子句,允許使用窗口函數(例如帶有累積聚合的SUM)。這消除了對額外表操作的需求,並簡化了查詢:

<code class="language-sql">SELECT somedate, somevalue,
    SUM(somevalue) OVER(ORDER BY somedate) AS RunningTotal
FROM TestTable</code>
登入後複製

2. 相關子查詢:

相關子查詢可用於檢索每一行的運行總計:

<code class="language-sql">SELECT somedate, somevalue,
(
    SELECT SUM(somevalue) 
    FROM TestTable b 
    WHERE b.somedate < a.somedate
) AS RunningTotal
FROM TestTable a</code>
登入後複製

3. 基於游標的解決方案:

游標提供了一種逐步處理行(按特定順序)的機制。以下基於游標的解決方案增量計算運行總計:

<code class="language-sql">DECLARE @TotalTable table(id int primary key, somedate date, somevalue int, runningtotal int)

DECLARE forward_cursor CURSOR FAST_FORWARD 
FOR 
SELECT id, somedate, somevalue
FROM TestTable 
ORDER BY somedate


OPEN forward_cursor 

DECLARE @running_total int, 
    @id int, 
    @somedate date, 
    @somevalue int
SET @running_total = 0

FETCH NEXT FROM forward_cursor INTO @id, @somedate, @somevalue 
WHILE (@@FETCH_STATUS = 0)
BEGIN
     SET @running_total = @running_total + @somevalue
     INSERT @TotalTable VALUES(@id, @somedate, @somevalue, @running_total)
     FETCH NEXT FROM forward_cursor INTO @id, @somedate, @somevalue 
END

CLOSE forward_cursor
DEALLOCATE forward_cursor

SELECT * FROM @TotalTable</code>
登入後複製

結論

在SQL Server中,計算運行總計的方法選擇取決於數據大小、性能要求和SQL Server版本等因素。 “聚合集語句技巧”仍然是高效更新的一種可行選擇,而窗口函數在較新版本的SQL Server中提供了更直接的語法。應考慮相關子查詢和基於游標的解決方案以實現靈活性和控制。建議進行基準測試以確定特定場景下的最佳方法。

以上是如何在SQL Server中有效計算運行總計?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板