SQL Server: суммирование (или различие) значений каждой группы столбца, пока не будет выполнено условие для другого столбца - PullRequest
0 голосов
/ 19 февраля 2019

Я довольно новичок в SQL и использую SQL Server 2012. У меня есть пример из набора данных, который я использую ниже.Это набор данных бухгалтерского учета банковских операций и сумм счетов со следующими значениями: идентификатор клиента, дата счета, VADEKONTROL в качестве указания того, истек ли срок счета-фактуры, а не счет-фактура, BORC - это сумма счета, ALACAK - сумма полученного платежа, иBAKIYE - это общий баланс.Транзакции не по счетам являются банковскими квитанциями.

Что я хочу сделать для каждого клиента, так это вычесть из последней суммы BAKIYE значения в столбце BORC, начиная с последней записи и заканчивая разницей <= 0. Такжеследует прекратить вычитать, если больше нет записи о найденном сгруппированном клиенте.Таким образом, для M01516 999,59 следует вычитать из 1982,40, и поскольку разница не равна 0, продолжайте вычитать 982,81 и дальнейшие результаты (если они были) до тех пор, пока разница не станет <= 0. </p>

Также нет необходимости в вычитании, если последнее значение BAKIYE равно 0 для определенного клиента.

Основная логика выше и с этим:

  1. Я хочу выбратьзаписи, которые были вычтены из BAKIYE (пока BAKIYE не достигнет 0 или разница между суммой выбранных записей и bakiye не достигнет 0, в зависимости от того, как вы на это смотрите.

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

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).

1 Ответ

0 голосов
/ 19 февраля 2019

Я изменил запрос, предоставив 1 новый столбец и изменив ранее предоставленный исходный вычисляемый столбец.

Я также перевел некоторые имена столбцов, чтобы мне было легче с ними работать (мойПриносим извинения, если это доставляет вам неудобства.)

Этот запрос теперь показывает, когда сальдо достигает 0, убирая сумму долга (borc) с баланса на тот момент (бакие).Он также показывает для любого выставленного счета-фактуры, если есть непогашенный остаток для оплаты, включая любые кредиты (alacak).Это делается с использованием коррелированного встроенного подзапроса, который вы использовали, но с использованием bdate вместо accid для установления последнего баланса и запроса записей до нажатия 0 или менее, а не после нажатия 0 или менее, что и происходило в вашей версии.запроса.

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

declare @t table (
ACCID nvarchar(10),
BDATE date,
MaturityControl nvarchar(15),
Debt float,
Credit float,
Balance float
);

insert into @t (ACCID, BDATE, MaturityControl, Debt, Credit, Balance)
values
('M01518',  '2018-12-12',  'expired',         64.51,     0.00,   64.51),
('M01518',  '2019-01-14',  'expired',         69.00,     0.00,  133.51),
('M01518',  '2019-02-12',  'not expired',     69.00,     0.00,  202.51),
('M01518',  '2019-02-18',  'not invoice',      0.00,   203.00,   -0.49),
('M01517',  '2018-12-14',  'expired',         93.49,     0.00,   93.49),
('M01517',  '2019-01-14',  'expired',         93.49,     0.00,  186.98),
('M01517',  '2019-02-12',  'not expired',     93.49,     0.00,  280.47),
('M01516',  '2018-12-25',  'expired',         982.81,    0.00,  982.81),
('M01516',  '2019-01-21',  'expired',         999.59,    0.00,  1982.40),
('M01514',  '2018-12-11',  'expired',          25.10,    0.00,    25.10),
('M01514',  '2019-01-10',  'not invoice',       0.00,   25.10,     0.00),
('M01514',  '2019-01-14',  'expired',          25.10,    0.00,    25.10),
('M01514',  '2019-01-24',  'not invoice',       0.00,   25.10,     0.00),
('M01514', ' 2019-02-11',  'not expired',      25.10,    0.00,    25.10),
('M00385',  '2018-11-19', 'expired',           2228.75, 0.00, 7689.75),
('M00385', '2018-11-29', 'expired',            2545.34, 0.00, 10235.09),
('M00385', '2018-12-18', 'expired',            2256.00, 0.00, 12491.09),
('M00385', ' 2018-12-20', 'not invoice',       0.00, 3000.00, 9491.09),
('M00385', '2018-12-28', 'not invoice',        0.00, 3500.00, 5991.09),
('M00385', '2018-12-31', 'expired',            2969.42, 0.00, 8960.51),
('M00385', '2019-01-18', 'expired',            2244.15, 0.00, 11204.66),
('M00385', '2019-01-24', 'not invoice',        0.00, 6000.00, 5204.66),
('M00385', '2019-01-29', 'expired',            2237.34, 0.00, 7442.00),
('M00385', '2019-02-18', 'not expired',        2217.11, 0.00, 9659.11);

select t.ACCID, t.BDATE, MaturityControl, Debt, Credit, Balance, 
case when Balance_Less_Debt is null then balance-debt else Balance_Less_Debt end as computed_difference_in_transactions,
(select((select top 1 Balance from @t as t4 where t.accid=t4.ACCID order by t4.BDATE desc)-
(select sum(Debt) from @t as t3 where t.ACCID=t3.ACCID and t.BDATE>=t3.BDATE))-
(select sum(Credit) from @t as t5 where t.ACCID=t5.ACCID and t.BDATE>=t5.BDATE)) as current_balance_less_summed_debt
from @t as t
outer apply (select ACCID, BDATE, Balance-Debt as Balance_Less_Debt from @t t2 where 
t.ACCID=t2.ACCID and t.BDATE=t2.BDATE and MaturityControl='expired'
group by ACCID, BDATE, Balance, Debt
having balance-Debt <=0
) 
agg 
where MaturityControl = 'expired'
order by t.ACCID desc, t.BDATE;
...