2013-11-17 4 views
0

Итак, позвольте мне описать, что я хотел бы рассчитать здесь. У меня есть 2 таблицы, в первой таблице, которая называется балансом, у меня есть одна строка для каждой учетной записи и ее соответствующий текущий баланс. На второй таблице у меня есть все депозиты и снятия средств для этих счетов и точное время, когда эти депозиты и снятие средств . Моя проблема заключается в вычислении на основе этих двух таблиц баланса всех счетов за каждый день.mysql расчет баланса, сгруппированный по дате

1.table баланс

|account_id| balance | 
|1111  | 1000 | 
|2222  | 3500 | 
|3333  | 10000 | 

2.table кредит

account_id|   date  |deposit_withdrawal| 
|1111  |2012-11-11 12:35:02|  250  | 
|1111  |2012-11-12 18:15:34|  750  | 
|1111  |2012-11-12 09:09:04|  -150  | 
|2222  |2012-01-12 10:05:04|  1000  | 
|2222  |2012-07-15 14:23:04|  -340  | 
|2222  |2012-12-29 13:01:04|  450  | 

Я выбираю счета с кредитной таблицы, получить сумму их deposit_withdrawal, а затем группу его по DAYOFYEAR.Now я застрял, я не могу понять, как рассчитать их баланс в каждую из этих дат. Как упоминалось выше, в балансовой таблице содержится текущий баланс счетов. Таким образом, самая последняя запись в таблице deposit_withdrawal уже учитывается в таблице баланса.

SELECT c.account_id , c.date , SUM(c.deposit_withdrawal) FROM credit c 
JOIN balance b on b.account_id = c.account_id 
GROUP by DAYOFYEAR (c.date) 
ORDER BY DAYOFYEAR(c.date) DESC 

EDIT: Спасибо всем за ваши ответы, и позвольте мне объяснить это немного больше, позволяет сказать, что у нас есть счет с текущим балансом 2000 г. В таблице кредита он имеет 3 записей, 1 на 2012-10 -10 с выводом 300, 1 в 2012-11-11 с депозитом 400 и последним и самым последним в 2013-02-29 с депозитом 150. То, что я хочу сделать, это найти его баланс для все даты между 2013-02-29 и 2012-10-09. Я знаю, что в 2013-02-29, который является самым последним, его баланс равен его текущему балансу = 2000. Так что накануне, в 2013-02-28, я знаю, что его баланс будет текущим балансом (2000) - последний депозит (150) = 1850. До 2012-11-11 его баланс не изменился. В 2012-11-11 он депонировал 400, поэтому накануне в 2012-11-10 его баланс был бы 1850-400 = 1450 и т. Д.

+1

Почему вы должны ПРИСОЕДИНИТЬСЯ к двум? баланс в день не будет равен суммарному балансу –

+1

* «баланс всех счетов за каждый день» * Решение этой проблемы - «ВЫБЕРИТЕ СУММУ (баланс) ОТ баланса», поэтому, я полагаю, вы не просите ваш вопрос правильно. Я не знаю, каков ваш предполагаемый конечный результат. –

+0

Я отредактировал сообщение и включил update.Anyone? – user3001861

ответ

0

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

Мы можем сделать это, глядя на каждой кредитной записи, найти записи, которые приходят после него, и применяя их к балансу:

CREATE TABLE transaction_history (
SELECT 
    credit.account_id, 
    credit.`date`, 
    credit.deposit_withdrawal, 
    COALESCE(balance.balance - SUM(next_transactions.deposit_withdrawal), balance.balance) AS balance 
FROM 
    credit 
LEFT JOIN 
    credit AS next_transactions 
ON 
    next_transactions.account_id = credit.account_id 
AND 
    next_transactions.`date` > credit.`date` 
INNER JOIN 
    balance 
ON 
    balance.account_id = credit.account_id 
GROUP BY 
    credit.account_id, 
    credit.`date`, 
    credit.deposit_withdrawal 
ORDER BY 
    credit.`date` DESC 
); 

Это создает нам баланс для каждого счета для каждого кредитного отчета. Но использовать это правильно, мы должны учитывать начальные остатки по счетам:

INSERT INTO transaction_history (account_id, `date`, deposit_withdrawal, balance) (
SELECT 
    balance.account_id, 
    '0000-00-00 00:00:00', 
    0, 
    COALESCE(earliest_transaction.balance - earliest_transaction.deposit_withdrawal, balance.balance) AS `balance` 
FROM 
    balance 
LEFT JOIN 
    transaction_history AS earliest_transaction 
ON 
    earliest_transaction.account_id = balance.account_id 
AND 
    earliest_transaction.`date` = (SELECT MIN(`date`) FROM transaction_history AS te WHERE te.account_id = balance.account_id) 
); 

Это вставляет записи для времени 0, как баланс перед любым из других сделок применяются, поэтому приходится 1111 имеет 150, счет 2222 имеет 2390 и счет 3333 имеет 10000. вы должны закончить с данными, выглядит следующим образом:

mysql> SELECT * FROM transaction_history; 
+------------+---------------------+--------------------+---------+ 
| account_id | date    | deposit_withdrawal | balance | 
+------------+---------------------+--------------------+---------+ 
|  2222 | 2012-12-29 13:01:04 |    450 | 3500 | 
|  1111 | 2012-11-12 18:15:34 |    750 | 1000 | 
|  1111 | 2012-11-12 09:09:04 |    -150 |  250 | 
|  1111 | 2012-11-11 12:35:02 |    250 |  400 | 
|  2222 | 2012-07-15 14:23:04 |    -340 | 3050 | 
|  2222 | 2012-01-12 10:05:04 |    1000 | 3390 | 
|  1111 | 0000-00-00 00:00:00 |     0 |  150 | 
|  2222 | 0000-00-00 00:00:00 |     0 | 2390 | 
|  3333 | 0000-00-00 00:00:00 |     0 | 10000 | 
+------------+---------------------+--------------------+---------+ 
9 rows in set (0.00 sec) 

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

SELECT 
    balance 
FROM 
    transaction_history 
WHERE 
    account_id = 1111 
AND 
    `date` <= '2012-11-12 23:59:59' 
ORDER BY 
    `date` DESC 
LIMIT 1; 
+0

Большое спасибо за ответ!Я думаю, что это решит мою проблему. – user3001861

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