2011-11-16 47 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/questions/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:是的,你是完全正确的,我知道我的查询不是高性能的......但它确实是我知道的唯一方法。还有其他人可以肯定,但相信我,我不认识他们。这是我可以给OP做出的唯一贡献... – Marco

+0

将't1.group'添加到主select语句,并将子查询中的where子句修改为WHERE t2.ID <= t1.ID和t1.group = t2.group',以满足修改后的问题要求。 –

0

我觉得你最好的选择是动态计算滚石总的看来,作为@Marco建议。

在大多数情况下,将这样的字段直接放在表中是没有什么意义的,因为与每行相关的滚动总数将取决于行的插入顺序以及不能然后更新或删除行(这显然会影响跟随它们的行的滚动总数)。

如果这是您真正需要的(即表中的行具有“自然”顺序,并且在第一次插入后不会更新/删除),则可以使用触发器计算插入时的滚动总数。语法取决于您正在使用的RDBMS。