У меня есть ряд транзакций, которые переносят инвентарь с одного счета на другой. Я могу передать весь инвентарь, и я могу передать частичный инвентарь.
Мне нужно заплатить комиссию владельцу счета, на котором находится инвентарь, на дату моей комиссии.
В моем отчете необходимо указать исходное происхождение предметов инвентаря, если они были переданы, и предоставить unit_balance, из которого я могу рассчитать комиссию.
Пример транзакций:
Счет 100
Счет, trxid, transacted_units, тип транзакции, Transferfrom, Transferto, дата
100, 1, 100, купить, NULL, NULL, 1/1/2020
100, 2, 50, передача в, 200, NULL, 1/2/2020
Счет 200
Счет, trxid, transacted_units, тип транзакции, TransferFrom, Transferto, дата
200, 3, 40, купить, NULL, NULL, 12/1/2019
200, 4 , 30, купить, NULL, NULL, 12/2/2019
200, 5, 7, продать, NULL, NULL, 12/3/2019
200, 6, 50, вывести, NULL, 100, 1/2/2020
В моих выходных данных отчета должны отображаться полные сведения об учетных записях, связанных с инвентаризацией, связанной с unit_bala nce
Выходные данные отчета:
[уровень], Account, trxid, parenttrxid, transacted_units, тип транзакции, TransferFrom, Transferto, Date, units_balance
0, 100, 1, NULL , 100, купить, NULL, NULL, 1/1/2020, 100
0, 100, 2, NULL, 50, передача в, 200, NULL, 1/2/2020, NULL
1, 200, 3, 2, 40, купить, NULL, NULL, 01.12.2009, 33
1, 200, 4, 2, 30, купить, NULL, NULL, 12.12.2009, 17
1, 200, 5, 2, 7, продажа, NULL, NULL, 03.12.2009, 0
1, 200, 6, 2, 50, выписка, NULL, 100, 1/2/2020, 0
* Лог FIFO c применяет 7 единиц, проданных к первой покупке для счета 200. Затем при переводе необходимо рассчитать unit_balance по оставшимся приемлемым транзакциям.
SQL код I «Сегодня» работает только тогда, когда я перевожу полную сумму инвентаря, а не частичную передачу:
select
[level],
parentid,
trxid,
account,
transactiontype,
date,
rnk,
transacted_units,
cumulative,
CASE
WHEN cumulative>0 and transacted_units>=cumulative THEN cumulative
WHEN cumulative>0 and transacted_units<cumulative THEN transacted_units
ELSE 0
END units_bal
from (
select
*,
sum(transacted_units*Positive_Negative_Indicator) over (partition by parenttrxid, account order by rnk, date, trxid RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) cumulative
from (
select *,
CASE
WHEN transacted_units*Positive_Negative_Indicator < 0 THEN 0
ELSE ROW_NUMBER() OVER (PARTITION BY parenttrxid, account ORDER BY Positive_Negative_Indicator ASC, date ASC, trxid ASC)
END rnk
from Transactions
) a
) a
Поле positive_negative_indicator представляет направление транзакции. Продажа или передача отрицательны, а остальные положительны.