首先,我的表格:
mysql> desc invoice;
+-------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | timestamp | YES | | NULL | |
| sent | timestamp | YES | | NULL | |
| due_date | timestamp | YES | | NULL | |
| amount | float | YES | | NULL | |
| amount_due | float | YES | | NULL | |
| status | enum('unpaid','paid') | YES | | NULL | |
| customer_id | int(11) | NO | MUL | NULL | |
+-------------+-----------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)有没有人能帮我想出一个对每一行都会返回的查询:
当天(按due_date分组)当天的起始余额(这将是前一天的结束余额)流入(当天正交易的总数)流出(当天负交易的总数)期末余额(所有流入和流出交易都已应用后的一天的期末余额)
基本上,我每天都想知道存了多少钱,取了多少钱,一天的余额是从什么时候开始的,以及结束时的余额。
我还应该指定当天,我希望按"due_date“对行进行分组,并使用"amount”列作为所有事务的基础(忽略amount_due)。
有什么想法吗?
我可以开始制作另一个只包含这些信息的表,但我想也许有人可以想出一个很好的查询,可以从实际数据中做到这一点。
发布于 2011-12-26 12:16:53
这是我对它的看法。基本上,您可以通过以下方式重新加入发票表
todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1)所以你可以访问昨天的amount_due字段(我做了一个左连接,所以如果你在你的表中请求第一天,你仍然会得到一条记录)
剩下的就很简单了。我不确定今天的期末余额是昨天+流入+流出的总和,还是仅仅是todaydata.amount_due的总和,所以我把两者都包括在内。
SELECT
todaydata.due_date,
SUM(case when yesterdaydata.amount_due is null then 0 else yesterdaydata.amount_due end )) AS StartingBalance,
SUM(CASE when todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) AS INFLOW,
SUM(CASE when todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS OUTFLOW,
SUM(yesterday.amount_due) AS StartingBalance +
SUM(CASE where todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) +
SUM(CASE where todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS CalculatedEndingBalance,
SUM(todaydata.amount_due) AS OtherEndingBalance
FROM invoice [todaydata]
LEFT JOIN invoice [yesterdaydata] ON todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1)
GROUP BY todaydata.due_date我没有能力在mysql数据库上测试它,所以如果有任何语法错误,请让我知道,我会纠正的。
发布于 2011-12-26 09:49:08
您需要将您的交易从发票表中拆分出来,如下所示:
TABLE invoice (
id int autoincrement,
due_date date,
customer_id int,
sent_date date
);
TABLE transaction (
id int autoincrement primary key
transaction_date date,
amount double,
transaction_type enum ("charge", "payment"),
customer_id int
);创建transaction表之后,您可以通过以下方式轻松获取所需的内容:
SELECT SUM(amount), transaction_type, transaction_date, customer_id FROM transaction GROUP BY customer_id, transaction_date, transaction_typehttps://stackoverflow.com/questions/8610772
复制相似问题