Вычислить текущий баланс в SQL из столбца Дебет / Кредит с временной переменной?

#sql #sql-server

#sql #sql-server

Вопрос:

Я хочу рассчитать текущий баланс в SQL server, но он показывает синтаксическую ошибку возле операторов ‘=’ и ‘: =’. Не знаю, как добавлять значения. Я делюсь своим SQL-запросом, который я использую.

SQL-запрос:

 declare @tempbal decimal(18,0)
set @tempbal = (select top 1 (balance)
from t1
left outer join t2 on t2.accountno = t1.accountno
left outer join t3 on t1.cc = t2.dc
where accountNo = '1234')

  
select 
'Date',
'Description',
isnull(case when t1.amount<0 then (t1.amount) end,0) as Debit,
isnull(case when t1.amount>0 then (t1.amount) end,0) as Credit,
 (@tempbal = @tempbal   (t1.amount) as balance
from t1
left outer join t2 on t2.accountno = t1.accountno
left outer join t3 on t1.cc = t2.dc
where accountNo = '1234')
 

Здесь я получаю:

неправильная синтаксическая ошибка возле ‘=’ sign в инструкции select.

Я много искал в Google, но не смог найти решение для решения этой проблемы. Я также использовал оператор ‘:=’, но это не сработало.

Я добавляю выходные данные, которые получаю после применения ‘ sum (t1.balance t1.amount) в качестве баланса’, здесь столбец баланса имеет значение 5970.12. на основе этого я получил это….Я также упомянул ожидаемый результат.

    Date     | Desc | Amount | Balance   | Expected Balance
2020-01-01  |Ref12 |  6.8   | 5976.92   | 5976.92
2020-01-06  |ref34 |  850   | 6820.12   | 6826.92
2020-01-22  |ref44 | 22032  | 28002.12  | 28858.92
2020-02-07  |ref54 | -26000 | -20029.88 | 2858.92
 

Пожалуйста, помогите мне выбраться из этого беспорядка…
Спасибо

Комментарии:

1. вы не можете присвоить значение переменной @tempbal просто так

2. какую версию SQL Server вы используете? Вы можете использовать SUM(col) OVER (ORDER BY somecol) для получения текущего итога

3. Вы можете проверить этот ответ .

4. Я использую Sql server 2017

5. Пожалуйста, добавьте примерные данные и ожидаемый результат в виде текста к вопросу.

Ответ №1:

Вы можете использовать SUM() OVER( ORDER BY ... ) для текущего итога

ваш запрос может быть следующим

 select [Date],
       [Description],
       isnull(case when t1.amount<0 then (t1.amount) end,0) as Debit,
       isnull(case when t1.amount>0 then (t1.amount) end,0) as Credit,
       SUM(t1.amount) OVER (ORDER BY [Date]) as balance
from   t1
       left outer join t2 on t2.accountno = t1.accountno
       left outer join t3 on t1.cc = t2.dc
where  t1.accountNo = '1234'
 

Обновленный запрос :
добавлен начальный баланс из первой строки в текущий баланс.

 select [Date],
       [Description],
       isnull(case when t1.amount<0 then (t1.amount) end,0) as Debit,
       isnull(case when t1.amount>0 then (t1.amount) end,0) as Credit,
       case when row_number() over (order by [Date]) = 1
            then balance
            else 0
            end
         SUM(t1.amount) OVER (ORDER BY [Date]) as balance
from   t1
       left outer join t2 on t2.accountno = t1.accountno
       left outer join t3 on t1.cc = t2.dc
where  t1.accountNo = '1234'
 

Комментарии:

1. Это добавление строки за строкой. Но я хочу добавить сумму дебета / кредита с предыдущим балансом, чтобы получить новый баланс …. Надеюсь, вы поймете суть.

2. @MohammadAreeb пожалуйста, добавьте некоторые примеры данных и ожидаемые результаты, чтобы проиллюстрировать ваши требования.

3. ORDER BY [Date] ROWS UNBOUNDED PRECEDING

4. @Squirrel Я обновил запрос, но он выдает ошибку в предложении order by …… Неправильный синтаксис рядом с ‘order’

5. Пожалуйста, обновите вопрос с помощью запроса, который вы использовали