mysql按日期分组的余额计算

mysql按日期分组的余额计算,mysql,Mysql,让我来描述一下我想在这里计算什么。我有两个表,第一个表叫做余额表,每个账户有一行及其对应的活期余额。第二个表有这些账户的所有存款和取款,以及这些存款和取款发生的确切日期和时间。我的问题是,根据这两个表,计算每天所有账户的余额 1.表格余额 |account_id| balance | |1111 | 1000 | |2222 | 3500 | |3333 | 10000 | 2.表格信用 account_id| date

让我来描述一下我想在这里计算什么。我有两个表,第一个表叫做余额表,每个账户有一行及其对应的活期余额。第二个表有这些账户的所有存款和取款,以及这些存款和取款发生的确切日期和时间。我的问题是,根据这两个表,计算每天所有账户的余额

1.表格余额

|account_id| balance |
|1111      |   1000  |
|2222      |   3500  |
|3333      |   10000 |
2.表格信用

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       |
我从信用表中选择账户,得到他们的存款和取款总额,然后按年月日分组。现在我陷入困境,我不知道如何计算每个日期的余额。如上所述,余额表包含账户的当前余额。因此,存款支取表上最近的分录已记入余额表

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

编辑:谢谢你们的回复,让我再解释一下,假设我们有一个账户,当前余额为2000。在信用表中,他有3个条目,一个在2012-10-10,提款300,一个在2012-11-11,存款400,最后一个和最近一个在2013-02-29,存款150。我想做的是找到他在2013-02-29和2012-10-09之间所有日期的余额。我知道2013年2月29日是最近一次,他的余额等于当前余额=2000。所以前一天,在2013年2月28日,我知道他的余额是活期余额(2000)-最后一笔存款(150)=1850。截至2012年11月11日,他的余额没有变化。2012年11月11日,他已存入400英镑,因此2012年11月10日的前一天,他的余额将为1850-400=1450,依此类推。

当您添加新记录时,您可能应该将余额存储在信用表中,这将使事情变得更简单。但是-我们可以在没有历史信息的情况下解决这个问题,我们只需要建立某种交易历史

我们可以通过查看每个信用记录,找到其后的记录并将其应用于余额:

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;
选择
平衡
从…起
交易记录
哪里
账户id=1111
及

`date`你为什么要加入这两个团队?每日余额不等于总余额“每天所有账户的余额”该问题的解决方案是从余额中选择总和(余额),因此我认为您的问题问得不对。我不知道你想要的最终结果是什么。我已经编辑了这篇文章并包含了更新。有人吗?非常感谢你的回答!我想那会解决我的问题。