总结列

时间:2014-02-12 12:53:32

标签: sql sql-server

这是我的样本表

create table #t (id int,qty int)
insert into #t values(1,100),(2,200),(3,150),(4,50)

我想要得到这个

id        qty       total_qty
1   100 100
2   200 300
3   150 450
4   50  500

这不起作用

select a.id,a.qty,sum(b.qty) as total_qty from #t

2 个答案:

答案 0 :(得分:4)

你想要一个累积总和。在SQL Server 2012中,您可以直接执行此操作:

select a.id, a.qty, sum(a.qty) over (order by a.id) as total_qty
from #t a;

在早期版本的SQL Server中,您可以使用相关子查询或非等值连接来执行此操作。以下是一个例子:

select t.id, t.qty,
       (select sum(t2.qty) from #t t2 where t2.id <= t.id) as total_qty
from #t t;

编辑:

表达式sum(a.qty) over (order by a.id)是表示累积和的窗口函数。 over正在说“为每一行做点什么”。它对每一行的作用是取a.qty的总和。但是,不仅仅是任何总和,一个考虑到排序的总和。 order by是使这成为累积总和的原因。 (如果没有order by条款,sum(a.qty) over ()将返回所有行的总和,作为每行中的附加列。)

答案 1 :(得分:1)

使用加入!

select a.id,a.qty,sum(b.qty) as total_qty from #t a cross join #t b where b.id<=a.id
group by a.id,a.qty
order by a.id

see Demo