Akshada Sane Ответов: 5

Расчет кредит дебет сальдо на SQL


Я хочу такой баланс в SQL-запросе, как это сделать..??
+------+-------+--------+---------+
|   Id | debit | credit | balance |
+------+-------+--------+---------+
|    1 |    10 |      0 |      10 |
|    2 |     0 |     40 |     -30 |
|    3 |    50 |      0 |      20 |
|    4 |     0 |     10 |      10 |
|    5 |     0 |     10 |       0 |
+------+-------+--------+---------+ 


Что я уже пробовал:

SELECT x.Id
     , x.debit
     , x.credit
     , SUM(y.Balance) balance 
  FROM
     ( 
       SELECT *,debit-credit bal FROM Ledger
     ) x
  JOIN
     ( 
       SELECT *,debit-credit bal FROM Ledger
     ) y
    ON y.Id<= x.Id
 GROUP 
    BY x.Id,x.debit,x.credit;

PIEBALDconsult

Смотреть в рекурсивных обобщенных табличных выражений.

5 Ответов

Рейтинг:
24

Bryian Tan

Вы можете использовать ту же концепцию отсюда: Как я могу учитывать нулевые значения в текущей сумме?[^]

Единственное отличие заключается в том, что сначала запрос должен найти разницу между дебетом и кредитом, а затем запустить расчет текущей суммы. Ниже в качестве примера.

DECLARE @RunTotalTestData TABLE  (
   Id    int not null identity(1,1) primary key,
   Debit int null,
   Credit int null
);
 
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (10, 0);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (0, 40);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (50, 0);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (0, 10);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (0, 10);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (100, 10);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (0, 10);
INSERT INTO @RunTotalTestData (debit, Credit) VALUES (0, 110);
;WITH tempDebitCredit AS (
	SELECT a.id, a.debit, a.credit, a.Debit - a.Credit 'diff'
	FROM @RunTotalTestData a
)
SELECT a.id, a.Debit, a.Credit, SUM(b.diff) 'Balance'
FROM   tempDebitCredit a,
       tempDebitCredit b
WHERE b.id <= a.id
GROUP BY a.id,a.Debit, a.Credit


Выход:
id	Debit	Credit	Balance
1	10	     0	     10
2	0	     40	    -30
3	50	     0	     20
4	0	     10	     10
5	0	     10	      0
6	100	     10	     90
7	0	     10	     80
8	0	     110	-30


Akshada Sane

Большое спасибо!

kirthiga S

Очень мило

Рейтинг:
2

Maciej Los

Я бы настоятельно рекомендовал прочитать это: Вычисление простых текущих итогов в SQL Server[^].


Рейтинг:
2

Member 10743924

Я добавил возможность получить принесенный вперед баланс к приведенному выше решению Брайана

WITH tempDebitCredit AS (
Select 0 As Details_ID, null As Creation_Date, null As Reference_ID, 'Brought Forward' As Transaction_Kind, null As Amount_Debit, null As Amount_Credit, isNull(Sum(Amount_Debit - Amount_Credit), 0) 'diff'
From _YourTable_Name
where Account_ID = @Account_ID
And Creation_Date < @Query_Start_Date
Union All
SELECT a.Details_ID, a.Creation_Date, a.Reference_ID, a.Transaction_Kind, a.Amount_Debit, a.Amount_Credit, a.Amount_Debit - a.Amount_Credit 'diff'
FROM _YourTable_Name a
where Account_ID = @Account_ID
And Creation_Date >= @Query_Start_Date And Creation_Date <= @Query_End_Date
)

SELECT a.Details_ID, a.Creation_Date, a.Reference_ID, a.Transaction_Kind, 
a.Amount_Debit, a.Amount_Credit, SUM(b.diff) 'Balance'
FROM   tempDebitCredit a, tempDebitCredit b
WHERE b.Details_ID <= a.Details_ID
GROUP BY a.Details_ID, a.Creation_Date, a.Reference_ID, a.Transaction_Kind, 
a.Amount_Debit, a.Amount_Credit
Order By a.Details_ID Desc

Протестировано на Microsoft SQL Server


Рейтинг:
1

Tim Carmichael

Согласен с PIEBALDConsult, но я добавлю вот что:

Баланс для каждой последующей строки зависит от конечного баланса из предыдущей строки. Вы можете либо написать SQL для циклического перебора каждой транзакции по одной, либо, как было предложено, изучить рекурсивные выражения.

Попробуйте один или другой, а затем опубликуйте то, что вы пробовали.


Рейтинг:
0

Md.Tariqur Rahaman

выбирать
х.идентификатор,
(sum(y.bal)-x.vin)+x.vout как Opening_Balance,
х.вин х.Uвых,сумма(у.бал) Closing_Balance
от
(выберите *,vin-vout bal из таблицы tblbalancesheet) x
присоединиться
(выберите *,vin-vout bal из таблицы tblbalancesheet) y
На y.id<=x.id
группа по x.id,x.vin,x.vout,x.vdate