2015-07-20 6 views
0

У меня есть таблица:SQL сумма предыдущих записей

year val 
---- ---- 
2013 4 
2014 6 
2014 2 
2014 6 
2015 1 
2015 3 
2016 7 

есть способ, чтобы получить сумму предыдущих лет за каждый год в таблице? результат должен быть таким:

2013 0 
2014 4 
2015 18 
2016 22 
2017 29 

Я пытался что-то вроде этого:

select year, sum(val) from 
(select year, val from table ?????) 
group by year 

Там должно быть внутреннее соединение где-то может быть?

+0

У вас нет ПЕРВИЧНОГО КЛЮЧА. Со временем это может оказаться проблематичным. – Strawberry

ответ

1

Если вы хотите старые лет только потом использовать этот запрос

SELECT DISTINCT year , (SELECT SUM(val) FROM table as temp2 WHERE temp2.year < temp1.year) as v FROM table as temp1 

Если вы хотите включить год, то измените temp2.year < temp1.year на < =, если вы хотите, чтобы фильтровать по годам, а затем использовать сравнение =

так

SELECT DISTINCT year , (SELECT SUM(val) FROM table as temp2 WHERE temp2.year <= temp1.year) as v FROM table as temp1 

и

SELECT DISTINCT year , (SELECT SUM(val) FROM table as temp2 WHERE temp2.year = temp1.year) as v FROM table as temp1 

но последняя может быть легко сделано без подзапроса, просто выбрав год и сумма (val) затем группа по году

+0

Я закончил тем, что использовал этот ответ, потому что это был единственный, который не использовал переменные. Благодарю. – hhh3112

0

Попробуйте

select year, @previous := @previous + sum(val) 
from your_table 
cross join (select @previous := 0) p 
group by year 
order by year 
1

Ваш вопрос немного сложным, потому что вы хотите 0 за первый год:

select year, 
     ((@p := @p + sumval) - sumval) as cumeprev 
from (select year, sum(val) as sumval 
     from table t 
     group by year 
    ) t cross join 
    (select @p := 0) params 
order by year; 
Смежные вопросы