2012-02-04 2 views
1

У меня есть следующие данные в моей таблице:Запуск Всего на сегодняшний день колонка

id invoice_id date   ammount 
1 1   2012-01-01 100.00 
20 1   2012-01-31  50.00 
470 1   2012-01-15 300.00 

Теперь мне нужно рассчитать нарастающий итог для счета в какой-то период. Таким образом, выход для этой выборки данных должен выглядеть следующим образом:

id invoice_id date   ammount running_total 
1 1   2012-01-01 100.00   100.00 
470 1   2012-01-15 300.00   400.00 
20 1   2012-01-31  50.00   450.00 

Я пытался с этими образцами http://www.sqlusa.com/bestpractices/runningtotal/ и несколькими других, но проблема в том, что я мог бы иметь записи, как ИО 20, дата 2012-01-31 и id 120, дата 2012-01-01, а затем я не мог использовать NO = ROW_NUMBER (по дате) ... при первом выборе, а затем ID < НЕТ во втором выборе для расчета общей суммы.

ответ

0
DECLARE @DateStart DATE='2012-01-01'; 

WITH cte 
    AS (SELECT id = Row_number() OVER(ORDER BY [date]), 
       DATE, 
       myid = id, 
       invoice_id, 
       orderdate = CONVERT(DATE, DATE), 
       ammount 
     FROM [Table_2] 
     WHERE DATE >= @DateStart) 
SELECT myid, 
     invoice_id, 
     DATE, 
     ammount, 
     runningtotal = (SELECT SUM(ammount) 
         FROM cte 
         WHERE id <= a.id) 
FROM cte AS a 
ORDER BY id 

enter image description here

+0

ТНХ. проблема заключалась в том, что i вместо cte в подзаголовке, используемом во время выполнения, использовался [Таблица_2]. – davor

+1

Я бы упомянул, что 'DATE' является зарезервированным словом и что, если он должен использоваться, он должен быть окружен квадратными скобками, чтобы различать столбец и ключевое слово (выражение« CONVERT »выше, например, выглядит смешно для меня). –