2010-12-07 72 views
3

我有以下我如何通过纯sql执行此查询?

first  second 
-------  ---------- 
100  0 
200  0 
0   400 

我希望得到以下结果

first  second  result 
-------  ---------- ---------- 
100  0   100 
200  0   300 
0   400   -100 

正如你可以看到结果的参数表是以前的(第一总和)的总和我怎么能写这样的查询?

MYSQL解决方案非常简单,但简单的解决方案正在寻找Microsoft Sql Server。

set @result =0; 
select first, second, @result := @result + first - second as result 
from tablo; 

导致

first second result 
100 0  100 
200 0  300 
0  400  -100 

回答

3

这是一个带有公共表格表达式的版本。它也遭受缺乏订购的问题,所以我使用第二个,第一个获得期望的结果。

WITH cte as 
    (
    select [first], [second], [first] - [second] as result, 
     ROW_NUMBER() OVER (ORDER BY second, first) AS sequence 
    from tableo 
    ) 

SELECT t.[first], t.[second], SUM(t2.result) AS result 
from cte t 
JOIN cte t2 on t.sequence >= t2.sequence 
GROUP BY t.[first], t.[second] 
+0

select * into #gec from tab; alter table #gec add result float; declare @result float; set @result = 0;更新#gec set @ result = result = @ result + first-second;选择* from #gec; – 2010-12-21 22:12:14

4

你的第一个问题是,你假设为了那里是没有的。没有order by子句的查询没有保证顺序。没有聚集索引的表没有定义的顺序。

因此,如果我们解决这个问题,把一个identity列在表上,这样我们就拥有一个定义良好的顺序,你可以使用递归CTE这样做(在MSSQL 2005和更新版本):

with running_sum as (
    select 
    t.id, t.first, t.second, t.first-t.second as result 
    from 
    table t where t.id = 1 
    UNION ALL 
    select 
    t.id, t.first, t.second, r.result+t.first-t.second 
    from 
    table t 
    join running_sum r on r.id = t.id - 1 
) 
select 
    * 
from 
    running_sum 
order by 
    id 
+0

谢谢,这是好的 – 2010-12-08 00:11:49