将列汇总到某一行(使用GROUP BY和OVER)?

时间:2012-06-13 10:26:14

标签: sql sql-server

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

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

...等

我想将这些活动总结为

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 个答案:

答案 0 :(得分:1)

you can use running total 

查看这篇文章

Running total in sqlserver stackoverflow

答案 1 :(得分: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中引入的。

答案 2 :(得分:0)

根据实际表的大小,这会降低,但这应该可以解决问题: 围绕这一点的一些有趣的解读可以找到here

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

答案 3 :(得分:0)

试试这个:

select d2.ID,sum(d1.duration) 
from durations d1,durations d2
where d1.id<=d2.id
group by d2.id