0

我需要一种更快的方法来计算和显示运行总和。

这是一个 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”可以一直更改......可以添加新项目等。我当然需要一些可以即时计算运行总和的东西(当点击刷新按钮时)。存储过程或其他视图...?请指教。

解决方案:(众多之一,这个比子查询快几个数量级)

创建一个包含视图中除RunningTotalcol之外的所有列的新表。创建一个存储过程,首先截断表,然后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用于所有报告。

4

1 回答 1

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,这取决于您希望如何使用它们 - 您希望它们任意排序还是希望它们具有相等的数量?

于 2012-12-08T17:10:43.347 回答