MySQL Начальное сальдо с диапазоном дат - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть таблица transactions в моей базе данных MySQL с 50K записями. Данные выглядят так, как показано ниже.

trx_date    bill        due
2020-03-01  100.00      10.00
2020-03-02   50.00      20.00   
2020-03-02  100.00       0.00  
2020-03-03  200.00      30.00  
2020-03-04  100.00      10.00
...
...

Моя цель - показать результат запроса с параметрами запроса from_date и to_date

с начальной даты открытия таблицы будет 0 и расчет будет

opening(+) bill (+) due (-) closing = ( opening+bill ) - due

trx_date    opening     bill        due     closing
2020-03-01  0           100.00      10.00    90.00
2020-03-02  90.00       50.00       20.00   120.00     
2020-03-02  120.0       100.00       0.00   220.00
2020-03-03  220.00      200.00      20.00   400.00  
2020-03-04  400.00      110.00      10.00   500.00
....
....

Я не могу понять, какой оптимальный способ получить предыдущую дату closing для моей выбранной из_даты opening.

from_date=2020-03-03 и to_date=2020-03-04

trx_date    opening     bill        due     closing    
2020-03-03  220.00      200.00      20.00   400.00  
2020-03-04  400.00      110.00      10.00   500.00

Здесь моя точка зрения заключается в том, как я могу получить открытие 220.00 из предыдущего результата? Для получения 220,00 от предыдущего результата могут быть тысячи записей, так что, какова будет лучшая практика?

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Попробуйте

SET @fromDate='2020-03-03', @toDate='2020-03-04';
SET @minDate = (SELECT MIN(trx_date) FROM transactions);
SET @previousDate=DATE_SUB(@fromDate,INTERVAL 1 DAY);

SELECT trx_date,@balance opening, bill, due, @balance := @balance + bill - due closing
FROM transactions, (SELECT @balance := (SELECT SUM(bill)-SUM(due) FROM transactions WHERE trx_date BETWEEN @minDate AND @previousDate)) variable
WHERE trx_date BETWEEN @fromDate AND @toDate ORDER BY trx_date;
1 голос
/ 27 апреля 2020

Вам необходимо вычислить все значения opening и closing, начиная с первого trx_date, а затем отфильтровать результаты по интересующим вас датам:

SELECT trx_date, opening, bill, due, closing
FROM (
  SELECT trx_date, 
         @balance AS opening,
         bill,
         due,
         @balance := @balance + bill - due AS closing
  FROM transactions
  CROSS JOIN (SELECT @balance := 0) ini
  ORDER BY trx_date
) tx
WHERE trx_date BETWEEN '2020-03-03' AND '2020-03-04'

Вывод:

trx_date    opening     bill    due     closing
2020-03-03  220         200     20      400
2020-03-04  400         110     10      500

Демонстрация на dbfiddle

0 голосов
/ 27 апреля 2020

Формально:

SELECT @balance opening, bill, due, @balance := @balance + bill - due closing
FROM source_table, (SELECT @balance := 0) variable
/* ORDER BY trx_date */
;

Но в показанных данных выборки нет уникальных критериев, поэтому результат не является детерминированным c.

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