2011-11-16 8 views
0

テーブルのフィールドにローリングトータルがあります。例:TSQL - インクリメンタル合計テーブルの下へ

ID - Name - Total - RollingTotal 
1 - James - 10 - 10 
2 - John - 20 - 30 
3 - Matthew - 10 - 40 

誰でもSQLでこれを行う方法を説明できますか?私は文字通りこれについてどうやって行くのか分かりませんし、それは私を混乱させています!

私は間違った質問をしました。私のテーブルは実際にはこのように見えます。

ID - Group - Name - Total - Rolling Total 
1 - 1 - James - 10 - 10 
2 - 1 - John- 10 - 20 
3 - 2 - Matthew - 20 - 20 
4 - 2 - Stephanie - 30 - 50 

ここではstackOverflowのエチケットとは何ですか?元々の質問は答えられましたが、私は十分に説明しませんでした。申し訳ありません。

+0

テーブルの行数はいくつですか? –

+0

http://www.eggheadcafe.com/microsoft/SQL-Server-Programming/33868189/incremental-sum-in-tsql.aspx –

+0

可能な複製[SqlServerでの合計の計算](http://stackoverflow.com)/question/860966/calculate-a-running-total-in-sqlserver) –

答えて

3

あなたは試みることができる:

ユーザー新しい要件後に編集
SELECT t1.ID, t1.Name, t1.Total, 
    (SELECT SUM(Total) FROM your_table t2 
    WHERE t2.ID <= t1.ID) AS RollingTotal 
FROM your_table t1 
ORDER BY ID 

SELECT t1.ID, t1.`group`, t1.Name, t1.Total, 
    (SELECT SUM(Total) FROM your_table t2 
    WHERE t2.ID <= t1.ID 
     AND t2.`group` = t1.`group`) AS RollingTotal 
FROM your_table t1 
ORDER BY ID 
+0

10,000行テーブルの場合、50,005,000の集計が行われます。 –

+0

@MartinSmith:はい、あなたは絶対に正しいです、私は私のクエリがperformantではないことを知っています...しかし、それは私が知っている唯一の方法です。確かに他の方が良いが、私を信じて、私はそれらを知らない。これは私がOPを与えることができる唯一の貢献です... – Marco

+0

メインのselect文に 't1.group、'を加え、 'WHERE t2.ID <= t1.IDおよびt1.groupになるようにサブクエリのwhere節を修正します= t2.group'、修正された質問の要件を満たす。 –

0

を私は@Marcoが示唆するように、あなたの最良の選択肢は、ビューで動的にローリング合計を計算することだと思います。

ほとんどの場合、各行に関連付けられたローリングの合計は行の挿入の順番に依存するため、テーブルのようなフィールドを直接配置するのは意味がありません。行が更新または削除されます(これは、後続の行のローリング合計に明らかに影響します)。

テーブルの行が「自然な」順序で、最初の挿入後に更新/削除されない場合は、挿入時にトリガーを使用してローリングトータルを計算することができます。構文は、使用しているRDBMSによって異なります。

関連する問題