2012-12-08 16 views
0

我需要一個更快的方法來計算和顯示運行總和。SQL運行總和爲MVC應用程序

這是一個MVC telerik網格,它查詢使用子查詢生成運行總和的視圖。查詢需要73秒才能完成,這是不可接受的。 (每用戶點擊「刷新預測表」的時候,它需要73秒重新填充網格。)

查詢看起來是這樣的:

SELECT outside.EffectiveDate 
[omitted for clarity] 
     ,(
       SELECT SUM(b.Amount) 
       FROM vCI_UNIONALL inside 
       WHERE inside.EffectiveDate <= outside.EffectiveDate 
      ) AS RunningBalance 
[omitted for clarity] 
FROM vCI_UNIONALL outside 

「EFFECTIVEDATE」對某些項目都可以改變時間...可以添加新項目等。我當然需要一些可以動態計算運行總和(當刷新按鈕被擊中時)。存儲過程或另一個視圖...?請指教。

解決方案:(一個許多,這是一個數量級比子查詢更快)

創建中除RunningTotal山坳視圖所有列的新表。創建一個首先截斷表的存儲過程,然後INSERT INTO該表使用SELECT所有列,沒有運行總和列。

使用更新的局部變量的方法:

DECLARE @Amount DECIMAL(18,4) 
SET @Amount = 0 
UPDATE TABLE_YOU_JUST_CREATED SET RunningTotal = @Amount, @Amount = @Amount + ISNULL(Amount,0) 

創建將運行每天一次的存儲過程任務代理。所有報告均使用TABLE_YOU_JUST_CREATED

回答

1

這個帖子 Calculate a Running Total in SQL Server

如果您具有SQL Server Denali車型,您可以使用新的窗口函數看看。

在SQL Server 2008 R2中,我建議你使用遞歸公用表表達式。 CTE中的一個小問題是,對於快速查詢,您必須具有無間隙標識列(1,2,3,...),如果您沒有這樣的列,則必須創建一個臨時或變量表一列,並將您的數據移動到那裏。

CTE的方法將是這樣的

declare @Temp_Numbers (RowNum int, Amount <your type>, EffectiveDate datetime) 

insert into @Temp_Numbers (RowNum, Amount, EffectiveDate) 
select row_number() over (order by EffectiveDate), Amount, EffectiveDate 
from vCI_UNIONALL 

-- you can also use identity 
-- declare @Temp_Numbers (RowNum int identity(1, 1), Amount <your type>, EffectiveDate datetime) 
-- insert into @Temp_Numbers (Amount, EffectiveDate) 
-- select Amount, EffectiveDate 
-- from vCI_UNIONALL 
-- order by EffectiveDate 

;with 
CTE_RunningTotal 
as 
(
    select T.RowNum, T.EffectiveDate, T.Amount as Total_Amount 
    from @Temp_Numbers as T 
    where T.RowNum = 1 
    union all 
    select T.RowNum, T.EffectiveDate, T.Amount + C.Total_Amount as Total_Amount 
    from CTE_RunningTotal as C 
     inner join @Temp_Numbers as T on T.RowNum = C.RowNum + 1 
) 
select C.RowNum, C.EffectiveDate, C.Total_Amount 
from CTE_RunningTotal as C 
option (maxrecursion 0) 

有很可能會出現一些問題與重複EffectiveDate值,它取決於你想如何與他們一起工作 - 做你想要他們去任意訂製還是你希望他們有相等的金額?

+0

謝謝,我會看那篇文章。我想我不能幹淨地使用CTE,因爲它是我查詢的視圖。該視圖查詢4,5個表以獲取項目,因爲它們的公共標識col是「EffectiveDate」列,這當然可以有差距。 – Kyle

+0

你使用Denali還是2008(或更早的版本)? –

+0

我正在使用2008 R2。 – Kyle

相關問題