Пример вычисления промежуточного итога для каждой записи, но только если OrderDate для записей на одну и ту же дату. Если для OrderDate задан другой день, то будет запущен новый промежуточный итог, который будет накапливаться для нового дня: (предположим, структура таблицы и данные)
select O.OrderId,
convert(char(10),O.OrderDate,101) as 'Order Date',
O.OrderAmt,
(select sum(OrderAmt) from Orders
where OrderID <= O.OrderID and
convert(char(10),OrderDate,101)
= convert(char(10),O.OrderDate,101))
'Running Total'
from Orders O
order by OrderID
Вот результаты, полученные в результате запроса с использованием примера таблицы заказов:
OrderId Order Date OrderAmt Running Total
----------- ---------- ---------- ---------------
1 10/11/2003 10.50 10.50
2 10/11/2003 11.50 22.00
3 10/11/2003 1.25 23.25
4 10/12/2003 100.57 100.57
5 10/12/2003 19.99 120.56
6 10/13/2003 47.14 47.14
7 10/13/2003 10.08 57.22
8 10/13/2003 7.50 64.72
9 10/13/2003 9.50 74.22
Обратите внимание, что "Итоговое значение" начинается со значения 10.50, а затем становится 22.00 и, наконец, становится 23.25 для OrderID 3, так как все эти записи имеют одинаковую OrderDate (10/11/2003). Но когда отображается OrderID 4, промежуточный итог сбрасывается, и текущий итог начинается заново. Это связано с тем, что OrderID 4 имеет другую дату для OrderDate, чем OrderID 1, 2 и 3. Вычисление этой промежуточной суммы для каждой уникальной даты снова выполняется с использованием коррелированного подзапроса, хотя требуется дополнительное условие WHERE, которое определили, что данные OrderDate в разных записях должны быть в один и тот же день. Это условие WHERE выполняется с помощью функции CONVERT для усечения OrderDate в формате MM / DD / YYYY.