SQL Running Total сбрасывается после x суммы

Я выполняю запрос о том, сколько раз человек использует автобазы в течение года, с разбивкой по кварталам. Каждый раз, когда человек объединяет автомобили 20 раз, он имеет право на оплату. Количество автомобилей продолжает накапливаться в течение года, но выплачивается только один раз в квартал.

У меня есть такие данные:

+-------+-----+--------+----+
|quarter|value|RunTotal|Paid|
+-------+-----+--------+----+
|Jan-Mar|19.0 |19.0    |0.00|
+-------+-----+--------+----+
|Apr-Jun|2.0  |21.0    |1.00|
+-------+-----+--------+----+
|Jul-Sep|0.0  |21.0    |0.00|
+-------+-----+--------+----+
|Oct-Dec|0.0  |21.0    |0.00|
+-------+-----+--------+----+

Как видно, они не получили чек в первом квартале. Тем не менее, они сделали во втором. Я могу рассчитать нарастающую сумму штрафа. Но мне нужно подсчитать промежуточную сумму в столбце «Оплачено» за вычетом всех предыдущих выплат. Пожалуйста, посмотрите и помогите мне.

DECLARE @SalesTbl TABLE (quarter varchar(250), value decimal(18,1), RunningTotal decimal(18,1), earned money)
DECLARE @RunningTotal decimal(18,1), @earned money
SET @RunningTotal = 0
SET @earned = 0

INSERT INTO @SalesTbl 
    SELECT CASE DatePart(q, c.date) 
    WHEN 1 THEN 'Jan-Mar' 
    WHEN 2 THEN 'Apr-Jun' 
    WHEN 3 THEN 'Jul-Sep' 
    WHEN 4 THEN 'Oct-Dec' END AS quarter,
    IsNULL(Sum(t.value),0) AS value,
    null,
    0
FROM @calendar c
LEFT OUTER JOIN events e ON (DatePart(q, c.date) = DatePart(q, e.eventDate) AND e.employeeID = @employeeID AND e.eventType = 'CP' AND Year(eventDate) = @year)
LEFT JOIN types t ON t.typeID = e.eventType
GROUP BY DatePart(q, c.date)

UPDATE @SalesTbl 
SET @RunningTotal = RunningTotal = @RunningTotal + value, @earned = earned = Floor(@RunningTotal/20) - (SELECT Sum(earned) FROM @SalesTbl)

FROM @SalesTbl

SELECT * FROM @SalesTbl

person Connie DeCinko    schedule 16.01.2014    source источник
comment
Какой механизм SQL вы используете? Похоже на SQL сервер, но какой версии?   -  person Gordon Linoff    schedule 17.01.2014


Ответы (1)


Похоже, вы должны использовать окна SQL

См. пример на странице ниже: http://technet.microsoft.com/en-us/library/ms189461.aspx

Вы должны разделить по кварталам (DatePart (q, c.date)) и SUM (t.value). SUM(SUM(t.value)) OVER(PARTITION BY DatePart(q, c.date)) AS 'Total'

person GWines    schedule 17.01.2014