2017-01-15 1 views
2

У меня есть 3 стола. Счет. Транс и Баланс.Баланс Отрицательный на 3 месяца

Предположим, что учетная запись имеет только 2 счета. Номер счета 1 и 2.

Оба они имеют несколько транзакций в таблице Trans.

Сумма в таблице Trans равна балансу в любой момент времени для каждой учетной записи.

Пример: У учетной записи 1 и 2 у обоих было 50 долларов США. Счет 1 сделал транзакции за 100 долларов США, а счет 2 - транзакции только за 35 долларов.

Теперь учетная запись 1 имеет баланс отрицательных $ 50. Скажем, он депонировал 20 долларов. Несмотря на это, баланс по-прежнему отрицательный.

Мне нужен запрос, который проверяет, что баланс отрицательный для последовательных 3 месяцев или более с сегодняшней даты. (так что sysdate всякий раз, когда я запускаю это). Хотя у него был депозит в размере 20 долларов, баланс по-прежнему отрицательный.

Когда я использую transdate from trans table или lastupdate из таблицы баланса в качестве критерия 3 месяца, вышеуказанная учетная запись НЕ подбирается. Хотя, это отрицательно, но он видит транзакцию.

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

Колонны:

Account Table has AccountID 
Trans Table has AccountID, Amount, TransDate 
Balance Table has AccountID, Balance, LastUpdate 

Благодаря


Update

Trans Table 
Select * from trans where accountid = 1; 

Transdate Merchant Amount AccountID 
10/1/16 Employer 50  1 
10/4/16 Walmart  -20  1 
10/7/16 Kroger  -50  1 

Теперь его счет пошел отрицательный - $ 20 на 10/7/2016.

Transdate Merchant Amount AccountID 
12/01/16 Employer 10  1 

Его счет по-прежнему отрицательный. Если я запустил запрос сегодня (01/15/2017) или позже, его учетная запись должна быть поднята, потому что он по-прежнему имеет отрицательный баланс не менее 90 дней.

Balance Table 

Он хранит только 1 запись на одну учетную запись. На сегодняшний день, она показывает следующее:

AccountID Balance LastUpdate 
1   -10  12/01/2016 

LastUpdate является тот же день, как на последнюю дату совершения операции в Trans таблице для этого счета.

Я схожу с ума от того, как найти учетные записи, которые были отрицательными в течение 90 дней или более, даже если последний депозит пришел вчера, но счета по-прежнему отрицательны. У меня есть 50 000 учетных записей, которые мне нужно сделать для ....

+1

Можете ли вы предоставить нам некоторые данные? –

+1

Я не вижу ни одной колонки, указывающей тип транзакции (депозит или снятие средств). Как рассчитать баланс из таблицы Trans? – Hawk

+1

Просьба указать [Минимальный, полный и проверенный пример данных в ваших таблицах] (http://stackoverflow.com/help/mcve) – krokodilko

ответ

0

Мы собираемся провести Баланс бега для всех транзакций.Затем мы выберем самую последнюю транзакцию для каждой учетной записи и отфильтровываем ее только до тех пор, где:

  1. Последняя сделка длится более 90 дней; или
  2. максимальный баланс в течение последних 90 дней меньше, чем 0.

; 
WITH running_total AS (

     SELECT t.AccountID 
       ,t.Transdate 
       ,t.Amount 
       ,SUM(t.Amount) OVER (PARTITION BY t.AccountID ORDER BY t.Transdate ROWS UNBOUNDED PRECEDING) AS RunningTotal 
     FROM (
       -- Aggregate transctions by Account and Date 
       SELECT t.AccountID 
         ,t.Transdate 
         ,SUM(t.Amount) AS Amount 
       FROM Trans 
       GROUP BY t.AccountID 
         ,t.Transdate 
       ) t 

) 

SELECT * 
FROM running_total rt 
WHERE 
-- Most recent transaction 
rt.Transdate = (
     SELECT MAX(Transdate) 
     FROM running_total 
     WHERE AccountID = rt.AccountID 
) 
-- Current balance is negative 
AND rt.RunningTotal < 0 

-- Get maximum balance for all transctions in the past 90 days 
-- If none found (most recent transaction more than 90 days old), 
-- substitute -1 
AND COALESCE((
     SELECT MAX(RunningTotal) 
     FROM running_total 
     WHERE AccountID = rt.AccountID 
     AND Transdate >= DATEADD(DAY, -90, GETDATE()) 
), -1) < 0 
+0

См. Приведенные выше данные. – Amir

+0

@Amir, я обновил ответ на основе ** Обновить ** в вашем вопросе. – Serge

Смежные вопросы