テーブル変数を使用してデータを格納するストアドプロシージャを継承し、各行を実行中の合計計算で更新します。ボリュームのレコードの順序は非常に重要です。ボリュームを最高から最低に並べる必要があります(つまり、テーブルを移動するにつれて実行中の合計がますます大きくなります)。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