1

我有一张表格,列出了不同活动的持续时间。看起来像

id duration  
1  15  
2  30    
3  30  
4  45  
5  30  

...ETC

我想总结这些活动

for (lastActivity=1 to 5)
  SELECT id, SUM(duration) FROM durations
  WHERE id<=lastActivity

产生类似的输出

id endtime  
1  15
2  45
3  75  
4  120  
5  150  

其中每一行将活动的持续时间相加,直到其在列表中的位置。

这似乎是一项容易的任务(并且可能是),但我无法弄清楚 sql 应该如何产生这样的输出。我曾尝试将 GROUP BY 与 OVER 子句一起使用,但也许有更简单的方法可以做到这一点。

4

4 回答 4

1
you can use running total 

检查这篇文章

在 sqlserver stackoverflow 中运行总计

于 2012-06-13T10:31:04.007 回答
1
SELECT t.id, 
       t.duration, 
       rt.runningTotal 
FROM   mytable t 
       CROSS apply (SELECT Sum(duration) AS runningTotal 
                    FROM   emp 
                    WHERE  id <= t.id) AS rt 
ORDER  BY t.id 

APPLY运算符允许您为查询的外部表表达式返回的每一行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。对来自左输入的每一行评估右输入,并将生成的行组合起来作为最终输出。APPLY 运算符生成的列列表是左侧输入中的一组列,后跟右侧输入返回的列列表。

注意:要使用APPLY,数据库兼容级别必须至少为 90。这是在 sql server 2005 中引入的。

于 2012-06-13T10:38:10.293 回答
0

这将根据您的实际表的大小而降低,但这应该可以解决问题:可以在此处找到一些有趣的阅读

SELECT 1 as id,  15    as num into #test
UNION ALL SELECT 2,  30     
UNION ALL SELECT 3,  30   
UNION ALL SELECT 4,  45   
UNION ALL SELECT 5,  30  

select 
t1.id
,MAX(t1.num) as id_num
,SUM(t2.num) as running_total
from #test t1
LEFT OUTER JOIN #test t2 on t2.id <= t1.id
GROUP BY
t1.id
于 2012-06-13T10:38:36.287 回答
0

试试这个 :

select d2.ID,sum(d1.duration) 
from durations d1,durations d2
where d1.id<=d2.id
group by d2.id
于 2012-06-13T10:50:24.787 回答