2016-11-03 2 views
0

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

+1

Можете ли вы быть более конкретным? Просьба привести несколько примеров. Благодаря! – Nikki9696

+0

'UPDATE MyTable SET differenceColumn = column1-column2 WHERE dateColumn> = '01 -01-2016 'AND dateColumn <= '12 -31-2016'' - Возможно, что-то вроде этого. – Santi

+0

, вы можете иметь вычисленный столбец в таблице, или вы можете рассчитать это значение на лету, когда вам это нужно - это будет означать, что если он будет изменен в столбце 1 или столбце2, вам нужно будет обновить столбец разницы – Cato

ответ

0

Вы ищете общая сумма? Это проще сказать, чем сделать, но вам нужно рекурсивно ссылаться на все записи до текущего. Похоже, это:

declare @ledger table (LedgerId int, LedgerDate datetime, Amount decimal(2)) 

insert into @ledger (LedgerId, LedgerDate, Amount) values 
(1, dateadd(hour, -1, getdate()), 1.00), 
(2, dateadd(hour, -2, getdate()), 2.00), 
(3, dateadd(hour, -3, getdate()), 3.00), 
(4, dateadd(hour, -4, getdate()), 4.00), 
(5, dateadd(hour, -5, getdate()), 5.00), 
(6, dateadd(hour, -6, getdate()), 6.00) 
; 

declare @startDate datetime = dateadd(hour, -5, getdate()), 
    @endDate datetime = dateadd(hour, -2, getdate()) 


; 
with orderedByDate as (
    select 
      LedgerId, 
      LedgerDate, 
      Amount, 
      ROW_NUMBER() over (order by LedgerDate desc) rowNum 
     from @ledger 
     where LedgerDate between @startDate and @endDate 
), runningTotal as (
    select 
      orderedByDate.LedgerId, 
      max(case when orderedByDate.rowNum = previousValues.rowNum then orderedByDate.LedgerDate else 0 end) LedgerDate, 
      max(case when orderedByDate.rowNum = previousValues.rowNum then orderedByDate.Amount else 0 end) Amount, 
      sum(previousValues.Amount) Total 
     from orderedByDate 
      inner join orderedByDate previousValues 
       on orderedByDate.rowNum >= previousValues.rowNum 
     group by orderedByDate.LedgerId 

) 
select 
     LedgerId, 
     LedgerDate, 
     Amount, 
     Total 
    from runningTotal 

Это даст вам что-то вроде:

LedgerId | LedgerDate | Amount | Total 
---------|------------|--------|------- 
2  |2016-11-03 |2  |2 
3  |2016-11-03 |3  |5 
4  |2016-11-03 |4  |9 
5  |2016-11-03 |5  |14 
Смежные вопросы