首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL根据发票获取每日流入/流出?

MySQL根据发票获取每日流入/流出?
EN

Stack Overflow用户
提问于 2011-12-23 07:16:43
回答 2查看 432关注 0票数 2

首先,我的表格:

代码语言:javascript
运行
复制
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)。

有什么想法吗?

我可以开始制作另一个只包含这些信息的表,但我想也许有人可以想出一个很好的查询,可以从实际数据中做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-26 12:16:53

这是我对它的看法。基本上,您可以通过以下方式重新加入发票表

代码语言:javascript
运行
复制
todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1)

所以你可以访问昨天的amount_due字段(我做了一个左连接,所以如果你在你的表中请求第一天,你仍然会得到一条记录)

剩下的就很简单了。我不确定今天的期末余额是昨天+流入+流出的总和,还是仅仅是todaydata.amount_due的总和,所以我把两者都包括在内。

代码语言:javascript
运行
复制
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数据库上测试它,所以如果有任何语法错误,请让我知道,我会纠正的。

票数 0
EN

Stack Overflow用户

发布于 2011-12-26 09:49:08

您需要将您的交易从发票表中拆分出来,如下所示:

代码语言:javascript
运行
复制
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表之后,您可以通过以下方式轻松获取所需的内容:

代码语言:javascript
运行
复制
SELECT SUM(amount), transaction_type, transaction_date, customer_id FROM transaction GROUP BY customer_id, transaction_date, transaction_type
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8610772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档