2010-12-07 2 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

выбрать * в #gec с вкладки; alter table #gec добавить результат float; declare @result float; set @result = 0; update #gec set @ result = result = @ result + first-second; выберите * из #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

Смежные вопросы