Как рассчитать текущее сальдо / суммы на основе транзакций, представленных в нескольких записях - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь проследить за продажей и использованием подарочных карт. Я хочу рассчитать текущий остаток на каждой карте.

Specifity: Таблица, которую я использую, содержит все совершенные сделки. (одна транзакция на строку) У меня есть сумма транзакции, но нет прогрессивного остатка.

Как добавить новую двоеточие для расчета остатка после каждой транзакции (строки)

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

enter image description here

   SELECT C_NUMBER,
   CASE WHEN TRANSACTION_TYPE = 'VEN' THEN 'SALE' ELSE 'USE' END AS 
   [EVENT],
    TRANSACTION_DATE, AMOUNT FROM CARDS_TRANSACTION 
    WHERE C_NUMBER in ( '111111111895' , '16222222225082' )

Ожидается следующий вывод: (Новый столбец, вычисляющий разницу для записей типа события «Использование», поскольку остаток на событии «Продажа» равен сумме.

enter image description here

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Похоже, вы хотите накопительную сумму:

select ct.*,
       sum(case when event = 'SALE' then amount
                when event = 'USE' then - amount
           end) over (partition by number order by trans_date
                     ) as balance
from cards_transaction ct;
0 голосов
/ 03 мая 2019

Приведенный выше код отлично работает для уникальных номеров.К сожалению, у меня много пустых номеров карт и дубликатов, что делает неверным подсчет оставшегося баланса.

Мне удалось разделить дубликат, используя дату транзакции

   SELECT C_NUMBER, CASE WHEN TRANSACTION_TYPE = 'VEN' THEN 'SALE' ELSE 'USE' END AS  
   [EVENT], TRANSACTION_DATE, AMOUNT 
   FROM CARDS_TRANSACTION CT
   LEFT OUTER JOIN  CARDS_TRANSACTION  CARDS_TRANSACTION_SALE ON 
   CARDS_TRANSACTION_SALE.EVENT = 'SALE' AND 
   CARDS_TRANSACTION_SALE.C_NUMBER= CT.C_NUMBER AND  
   CARDS_TRANSACTION_SALE.TRANSACTION_DATE = (SELECT MAX(TRANSACTION_DATE) 
   FROM CARDS_TRANSACTION
   WHERE C_NUMBER = CT.C_NUMBER AND 
   EVENT = 'SALE' AND 
   TRANSACTION_DATE <= CT.TRANSACTION_DATE)

Есть ли способ обработать это исключение?использование UNION может иметь больше свободы?

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...