2015-04-17 4 views
0

Я пытаюсь суммировать столбец до текущей строки (в SQL Server). Как мне это сделать?Сумма столбца до текущей строки в SQL?

select t1.CounterTime, 
     t1.StartTime, 
     t1.EndTime, 
     isNull(t1.value, 0) as value1, 

     -- How do I make Total1 the sum of t1.value over all previous rows? 
     sum(isNull(t1.value, 0)) over (partition by t1.CounterTime order by t1.CounterTime) as Total1 

from SomeTable t1 
order by t1.CounterTime 

Но я получил partition by неправильно ...

╔═══╦═════════════════════════╦═════════════════════════╦═════════════════════════╦════════╦════════╗ 
║ ║  CounterTime  ║  StartTime  ║   EndTime   ║ value1 ║ Total1 ║ 
╠═══╬═════════════════════════╬═════════════════════════╬═════════════════════════╬════════╬════════╣ 
║ 1 ║ 2015-03-17 12:00:00.000 ║ 2015-03-17 00:00:00.000 ║ 2015-03-18 00:00:00.000 ║  0 ║  0 ║ 
║ 2 ║ 2015-03-18 12:00:00.000 ║ 2015-03-18 00:00:00.000 ║ 2015-03-19 00:00:00.000 ║  0 ║  0 ║ 
║ 3 ║ 2015-03-19 12:00:00.000 ║ 2015-03-19 00:00:00.000 ║ 2015-03-20 00:00:00.000 ║ 422 ║ 422 ║ 
║ 4 ║ 2015-03-20 12:00:00.000 ║ 2015-03-20 00:00:00.000 ║ 2015-03-21 00:00:00.000 ║ 989 ║ 989 ║ 
║ 5 ║ 2015-03-21 12:00:00.000 ║ 2015-03-21 00:00:00.000 ║ 2015-03-22 00:00:00.000 ║ 1162 ║ 1162 ║ 
║ 6 ║ 2015-03-22 12:00:00.000 ║ 2015-03-22 00:00:00.000 ║ 2015-03-23 00:00:00.000 ║ 524 ║ 524 ║ 
╚═══╩═════════════════════════╩═════════════════════════╩═════════════════════════╩════════╩════════╝ 

Должно быть:

╔════════╗ 
║ Total1 ║ 
╠════════╣ 
║  0 ║ 
║  0 ║ 
║ 422 ║ 
║ 1411 ║ 
║ 2573 ║ 
║ 3097 ║ 
╚════════╝ 
+0

Какую версию 'SQL Server' вы используете? – gotqn

+0

Возможно, используется коррелированный подзапрос, чтобы выполнить СУММ? – jarlh

+0

Это может быть очень связано, если не с dup: http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver – dotNET

ответ

4

Попробуйте
Удалить "раздел," использовать только "порядке"

select t1.CounterTime, 
      t1.StartTime, 
      t1.EndTime, 
      isNull(t1.value, 0) as value1, 

      -- How do I make Total1 the sum of t1.value over all previous rows? 
      sum(isNull(t1.value, 0)) over (order by t1.CounterTime) as Total1 

    from SomeTable t1 
    order by t1.CounterTime 
+0

Спасибо, это сработало. – Jonathan

+0

Итак, вы можете принять и перенести ответ правильно :)? –

1

здесь это образец пример для расчета хода составляет

declare @t table (id int,val int) 
insert into @t(id,val)values (1,0),(2,0),(3,411),(4,989),(5,1162),(6,524) 

SELECT ID, val, RunningTotal = val + COALESCE(
(
    SELECT SUM(val) 
    FROM @t AS i 
    WHERE i.ID < o.ID), 0 
) 
FROM @t AS o 
ORDER BY ID; 

В Sql 2012

SELECT ID, val, 
    RunningTotal = SUM(val) OVER (ORDER BY TID ROWS UNBOUNDED PRECEDING) 
FROM @t 
ORDER BY TID; 

тот же код может быть использован в запросе мое предположение countertime можно использовать Id, то он будет работать в соответствии с результатом

select t1.CounterTime, 
      t1.StartTime, 
      t1.EndTime, 
      isNull(t1.value, 0) as value1, 
      RunningTotal = t1.value + COALESCE(
(
    SELECT SUM(value) 
    FROM SomeTable AS i 
    WHERE i.CounterTime < o.CounterTime), 0 
) 

    from SomeTable t1 
    order by t1.CounterTime 
Смежные вопросы