2014-01-22 6 views
0

У меня есть один банкомат, который имеет информацию ниже:Вычесть накопленные значений в SQL Server 2008

- --Date-----|--Withdraw---|---CashLoad 
- 01/15/13--|----10----------|-------300 
- 01/16/13--|----20 
- 01/17/13--|----50 
- 01/18/13--|---120 
- 01/19/13--|----20----------|-------400 
- 01/20/13--|----60 
- 01/21/13--|----80 
- 01/22/13--|----50 
- 01/23/13--|----90----------|------300 

Я хочу, чтобы вычислить баланс конца-день для этого банкомата, этот баланс равняется CashLoad - накопленный Извлекайте суммы каждый день. Если банкомат перезагружается, процесс начинается снова

Вот что я ищу:

- --Date------|--Withdraw---|------CashLoad---|--------EOD_Balance 
- 01/15/13---|----10----------|-------300-----------|-----------290 
- 01/16/13---|----20----------|-----------------------|-----------270 
- 01/17/13---|----50----------|-----------------------|-----------220 
- 01/18/13---|---120---------|------------------------|----------100 
- 01/19/13---|----20----------|-------400-----------|-----------380 
- 01/20/13---|----60----------|-----------------------|-----------320 
- 01/21/13---|----80----------|-----------------------|-----------240 
- 01/22/13---|----50----------|-----------------------|-----------190 
- 01/23/13---|----90----------|-------300-----------|-----------210 

Это запрос, я в настоящее время с помощью:

select 
    tmp1.atminternalid, tmp1.date, 
    tmp1.CashLoad - tmp1.accum_disp as cashbalafterload 
from mytable as tmp1 where SettlementDate = (select max(SettlementDate) 
from DM_ADMIN.dbo.temptable1001 as tmp2 
where tmp2.ATMInternalID = tmp1.atminternalid) 
order by tmp1.atminternalid 

Как я изменить мой запрос, чтобы получить результаты, которые я ищу?

+0

Что вы сейчас пытаетесь? – digitalextremist

+0

Я создал еще один столбец с именем accum_Wtd, тогда я попытался использовать CashLoad для вычитания этих значений. Это еще не работает. выберите tmp1.atmid, tmp1.date, tmp1.CashLoad - tmp1.accum_wtd, как cashbalance из туЬаЫе в tmp1 где Date = (выберите тах (Дата) от туЬаЫе в tmp2 где tmp2.ATMID = tmp1.ATMID ) order by tmp1.ATMID – user3221030

+0

Добавил вопрос к вопросу, так как это важно знать. Добро пожаловать в SO! – digitalextremist

ответ

0

SQL Server 2008 не имеет функции суммирования суммы. Вы можете решить эту проблему с помощью связанного подзапроса:

select atm.*, 
     (select sum(cashload) - sum(withdraw) 
     from atm atm2 
     where atm2.date <= atm.date 
     ) as EOD_Balance 
from atm; 

EDIT:

Ну, это изменить эту проблему. Вам необходимо суммировать сумму с даты предыдущей денежной наличности:

select atm.*, 
     (select sum(cashload) - sum(withdraw) 
     from atm atm3 
     where atm3.date <= atm.date and 
       atm3.date >= CashLoadDate 
     ) as EOD_Balance 
from (select atm.*, 
      (select max(date) 
       from atm atm2 
       where atm2.date <= atm.date and 
        cashload > 0 
      ) as CashLoadDate 
     from atm 
    ) atm; 
+0

Спасибо за код, Гордон. – user3221030

+0

Спасибо за код, Гордон. Тем не менее, я забыл упомянуть, что до новой наличной нагрузки они сначала вынимали оставшиеся деньги, а затем загружали новую сумму в банкомат. Например: на 01/18/13, оставшиеся деньги составляли 100 долларов США, 19/19/13, они забрали 100 долларов США, поставили 400 долларов США, а EOD_Balance теперь составляет 380 (400 - 20 долларов США) не (400 долларов США + 100-20 долларов США)) – user3221030

+0

Я попробовал, но получил несколько сообщений об ошибках. Не могли бы вы помочь? Спасибо, Гордон! Msg 107, уровень 15, состояние 1, строка 7 Префикс столбца 'atm' не совпадает с именем таблицы или псевдонимом, используемым в запросе. Msg 4104, уровень 16, состояние 1, строка 10 Идентификатор с несколькими частями «atm.date» не может быть связан. Msg 8155, уровень 16, состояние 2, строка 14 Для столбца 1 «atm» не указано имя столбца. Msg 207, уровень 16, состояние 1, строка 4 Недопустимое имя столбца 'дата'. – user3221030

Смежные вопросы