Я довольно новичок в SQL и использую SQL Server 2012. У меня есть пример из набора данных, который я использую ниже.Это набор данных бухгалтерского учета банковских операций и сумм счетов со следующими значениями: идентификатор клиента, дата счета, VADEKONTROL в качестве указания того, истек ли срок счета-фактуры, а не счет-фактура, BORC - это сумма счета, ALACAK - сумма полученного платежа, иBAKIYE - это общий баланс.Транзакции не по счетам являются банковскими квитанциями.
Что я хочу сделать для каждого клиента, так это вычесть из последней суммы BAKIYE значения в столбце BORC, начиная с последней записи и заканчивая разницей <= 0. Такжеследует прекратить вычитать, если больше нет записи о найденном сгруппированном клиенте.Таким образом, для M01516 999,59 следует вычитать из 1982,40, и поскольку разница не равна 0, продолжайте вычитать 982,81 и дальнейшие результаты (если они были) до тех пор, пока разница не станет <= 0. </p>
Также нет необходимости в вычитании, если последнее значение BAKIYE равно 0 для определенного клиента.
Основная логика выше и с этим:
Я хочу выбратьзаписи, которые были вычтены из BAKIYE (пока BAKIYE не достигнет 0 или разница между суммой выбранных записей и bakiye не достигнет 0, в зависимости от того, как вы на это смотрите.
Подсчитайте и сложите выбранные записидля каждого клиента, скорее всего, с группировкой по.
edit:
Имейте в виду, что если значение BORC равно 0, транзакция является кредитом, а если значение ALACAK равно 0, тотранзакция является долгом. Таким образом, чтобы найти текущий баланс, начиная с последнего, нам, возможно, придется вычесть значения BORC и ALACAK из BAKIYE.
В основном, что я хочу, это для каждого у.е.Группа Stomer, начиная с последней записи: получить последнюю строку значения BAKIYE, вычесть BORC + ALACAK из BAKIYE для той же строки.Повторите это, поднимаясь вверх на одну строку, пока BAKIYE не станет <= 0 для каждого клиента.При этом я могу выбрать суммы счетов и количество счетов, которые будут покрывать остаток на счету клиента.</p>
Как я могу продолжить решение этой проблемы?
Любая помощь будет принята с благодарностью.
ACCID BDATE VADEKONTROL BORC ALACAK BAKIYE
------------------------------------------------------------
M01518 12.12.2018 expired 64,51 0,00 64,51
M01518 14.01.2019 expired 69,00 0,00 133,51
M01518 12.02.2019 not expired 69,00 0,00 202,51
M01518 18.02.2019 not invoice 0,00 203,00 -0,49
M01517 14.12.2018 expired 93,49 0,00 93,49
M01517 14.01.2019 expired 93,49 0,00 186,98
M01517 12.02.2019 not expired 93,49 0,00 280,47
M01516 25.12.2018 expired 982,81 0,00 982,81
M01516 21.01.2019 expired 999,59 0,00 1982,40
M01514 11.12.2018 expired 25,10 0,00 25,10
M01514 10.01.2019 not invoice 0,00 25,10 0,00
M01514 14.01.2019 expired 25,10 0,00 25,10
M01514 24.01.2019 not invoice 0,00 25,10 0,00
M01514 11.02.2019 not expired 25,10 0,00 25,10
выход edit2 с кодом Дуайта:
ACCID BDATE VADEKONTROL BORC ALACAK BAKIYE BAKIYE_less_BORC
M01518 2018-12-12 Vadesi Geçmiş 64,51 0,00 64,51 0,00
M01518 2019-01-14 Vadesi Geçmiş 69,00 0,00 133,51 64,51
M01518 2019-02-12 Vadesi Gelmemiş 69,00 0,00 202,51 NULL
M01518 2019-02-18 FaturaDegil 0,00 203,00 -0,49 NULL
M01517 2018-12-14 Vadesi Geçmiş 93,49 0,00 93,49 0,00
M01517 2019-01-14 Vadesi Geçmiş 93,49 0,00 186,98 93,49
M01517 2019-02-12 Vadesi Gelmemiş 93,49 0,00 280,47 NULL
M01516 2018-12-25 Vadesi Geçmiş 982,81 0,00 982,81 0,00
M01516 2019-01-21 Vadesi Geçmiş 999,59 0,00 1982,40 982,81
M01514 2018-12-11 Vadesi Geçmiş 25,10 0,00 25,10 0,00
M01514 2019-01-10 FaturaDegil 0,00 25,10 0,00 NULL
M01514 2019-01-14 Vadesi Geçmiş 25,10 0,00 25,10 0,00
M01514 2019-01-24 FaturaDegil 0,00 25,10 0,00 NULL
M01514 2019-02-11 Vadesi Gelmemiş 25,10 0,00 25,10 NULL
Я также использовал следующий код (FNM00_ACC_CODE ACCID) и получил почти правильный результат.
select FNM00_ACC_CODE,borc,alacak,BAKIYE,bdate,vadekontrol,
(cast(((SELECT TOP 1 BAKIYE FROM GRID_Temp_Current_Accounts_All_Can2 ac2
WHERE ac2.FNM00_ACC_CODE=c.FNM00_ACC_CODE ORDER BY ac2.ID desc)-
(select ISNULL(sum(convert(decimal(18,2),BORC)),'0.00') as money
from GRID_Temp_Current_Accounts_All_Can2 as ac
WHERE ac.FNM00_ACC_CODE=c.FNM00_ACC_CODE
and ac.id >= c.id)) as money)) BAKIYE2 from
GridTelekom_MetaData.dbo.GRID_Temp_Current_Accounts_All_Can2 c
FNM00_ACC_CODE borc alacak BAKIYE bdate vadekontrol BAKIYE2
M00385 2228,75 0,00 7689,75 2018-11-19 Vadesi Geçmiş -7039,00
M00385 2545,34 0,00 10235,09 2018-11-29 Vadesi Geçmiş -4810,25
M00385 2256,00 0,00 12491,09 2018-12-18 Vadesi Geçmiş -2264,91
M00385 0,00 3000,00 9491,09 2018-12-20 FaturaDegil -8,91
M00385 0,00 3500,00 5991,09 2018-12-28 FaturaDegil -8,91
M00385 2969,42 0,00 8960,51 2018-12-31 Vadesi Geçmiş -8,91
M00385 2244,15 0,00 11204,66 2019-01-18 Vadesi Geçmiş 2960,51
M00385 0,00 6000,00 5204,66 2019-01-24 FaturaDegil 5204,66
M00385 2237,34 0,00 7442,00 2019-01-29 Vadesi Geçmiş 5204,66
M00385 2217,11 0,00 9659,11 2019-02-18 Vadesi Gelmemiş 7442,00
Всякий раз, когда BAKIYE2 достигает значения минус, я хочу, чтобы транзакции были увеличены, в том числе и до этой точки.Поэтому для приведенного выше примера мне потребуются последние 5 строк, поскольку сумма BORC для последних 5 строк равна 9668,02, что на 8,91 больше, чем последний текущий BAKIYE, который равен 9659,11.Затем я могу различить просроченные сроки погашения и не просроченные сроки погашения.
С этим методом, хотя я думал о выборе всех записей, где BAKIYE2> = 0, однако при этом пропускалась бы последняя строка, в которой BAKIYE переводится в минусы (в этом случае он не выбирал бы 2969.42).