我已经继承了一个存储过程,该存储过程利用表变量来存储数据,然后使用正在运行的总计算来更新每一行。表格变量中的记录顺序非常重要,因为我们希望将卷的排列顺序从最高到最低(即当您沿着桌子走下去时,运行总量会越来越大)。在SQL Server表变量中使用运行总计算列
我的问题是,在更新表变量的步骤中,运行总计似乎在计算,但不是以表格变量中的数据先前排序的方式(按最高音量降序排列)
DECLARE @TableVariable TABLE ([ID], [Volume], [SortValue], [RunningTotal])
--Populate table variable and order by the sort value...
INSERT INTO @TableVariable (ID, Volume, SortValue)
SELECT
[ID], [Volume], ABS([Volume]) as SortValue
FROM
dbo.VolumeTable
ORDER BY
SortValue DESC
--Set TotalVolume variable...
[email protected] = ABS(sum([Volume]))
FROM @TableVariable
--Calculate running total, update rows in table variable...I believe this is where problem occurs?
SET @RunningTotal = 0
UPDATE @TableVariable
SET @RunningTotal = RunningTotal = @RunningTotal + [Volume]
FROM @TableVariable
--Output...
SELECT
ID, Volume, SortValue, RunningTotal
FROM
@TableVariable
ORDER BY
SortValue DESC
结果是,有一个最高音量的记录,我预计首先计算的运行总数(因此运行总数= [音量]),不知何故最终会进一步下降到列表中。正在运行的总似乎计算随机
这是我期望得到:
但这里是代码实际上产生:
不知道有一种方法可以让UPDATE语句在表变量上得到执行,以便按体积desc排序?从我迄今为止读过的内容来看,它可能是一个表变量的排序行为的问题,但不知道如何纠正?谁能帮忙?
不要这样做。您正在使用俗称的古怪更新方法。鉴于这是一个表变量,我已经知道你正在违背这项技术中的一些已知问题。此工作正确需要聚簇索引。看看这篇讨论这种技术的文章。 http://www.sqlservercentral.com/articles/T-SQL/68467/确保您阅读了评论。这种方法没有文件记录,而且争议很大。 Windows功能在这里更适合你。 –
[运行总计的最佳方法 - 为SQL Server 2012更新](https://sqlperformance.com/2012/07/t-sql-queries/running-totals) – GarethD
您的图像都显示按降序排序的卷,并按总排序升序排序,我没有看到问题... – Zack