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

MySQL是否根据发票获取每日流入/流出?,mysql,financial,Mysql,Financial,首先,我的桌子: mysql> desc invoice; +-------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-----------------------+------+-----+-----

首先,我的桌子:

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)
谁能帮我提出一个查询,每行返回:

当天(按到期日分组) 当天的起始余额(这将是前一天的结束余额) 流入(当日正交易的总额) 流出(当日负交易的总额) 期末余额(应用所有流入和流出交易后当天的期末余额)

基本上每天我都想知道存了多少钱,取了多少钱,当天开始的余额和结束的余额

我还应该指定,对于当天,我希望按“到期日”对行进行分组,并使用“金额”列作为所有交易的基础(忽略到期金额)

有什么想法吗


我可以开始制作另一个只包含这些信息的表,但我想也许有人可以提出一个漂亮的查询,可以根据实际数据进行查询。

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

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
);
创建事务表后,您可以通过以下方式轻松获得所需:

SELECT SUM(amount), transaction_type, transaction_date, customer_id FROM transaction GROUP BY customer_id, transaction_date, transaction_type

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

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
);
创建事务表后,您可以通过以下方式轻松获得所需:

SELECT SUM(amount), transaction_type, transaction_date, customer_id FROM transaction GROUP BY customer_id, transaction_date, transaction_type

这是我的看法。基本上,您可以通过

todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1)
因此,您可以访问昨天的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
选择
今天的数据。截止日期,
总和(当yesterdaydata.amount\u due为空时,则为0,否则yesterdaydata.amount\u due end))作为起始余额,
总和(当todaydata.amount>0时,则为todaydata.amount,否则为0结束)作为流入,
总和(当todaydata.amount<0时,则为todaydata.amount,否则为0结束)作为流出,
作为起始余额的金额(昨天应付金额)+
总和(如果todaydata.amount>0,则todaydata.amount为0结束)+
合计(如果todaydata.amount小于0,则todaydata.amount否则为0结束)作为计算的余额,
金额(今日数据、到期金额)作为其他余额
来自发票[今日数据]
在todaydata上左联合发票[yesterdaydata]。到期日=日期添加(yesterdaydata.到期日,日期,-1)
按todaydata.due\u日期分组

我没有能力对mysql数据库进行测试,所以请告诉我任何语法错误,我会纠正的。

以下是我的看法。基本上,您可以通过

todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1)
因此,您可以访问昨天的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
选择
今天的数据。截止日期,
总和(当yesterdaydata.amount\u due为空时,则为0,否则yesterdaydata.amount\u due end))作为起始余额,
总和(当todaydata.amount>0时,则为todaydata.amount,否则为0结束)作为流入,
总和(当todaydata.amount<0时,则为todaydata.amount,否则为0结束)作为流出,
作为起始余额的金额(昨天应付金额)+
总和(如果todaydata.amount>0,则todaydata.amount为0结束)+
合计(如果todaydata.amount小于0,则todaydata.amount否则为0结束)作为计算的余额,
金额(今日数据、到期金额)作为其他余额
来自发票[今日数据]
在todaydata上左联合发票[yesterdaydata]。到期日=日期添加(yesterdaydata.到期日,日期,-1)
按todaydata.due\u日期分组

我没有能力对mysql数据库进行测试,所以如果有语法错误,请告诉我,我会更正。

很抱歉回复太晚。。。假期等等。我使用了这个查询:
选择日期(todaydata.postdate)作为postdate,SUM(CASE when todaydata.amount>0然后todaydata.amount ELSE 0 END)作为流入,SUM(CASE when todaydata.amount<0然后todaydata.amount ELSE 0 END)作为从发票流出作为todaydata离开并作为昨日数据加入到todaydata.postdate=date\u ADD(yesterdaydata.postdate,间隔-1天)按日期分组(todaydata.postdate)
难看的格式堆栈溢出!哈我很难让StartingBalance和EndingBalance正常工作。EndingBalance相当于:StartingBalance+流入+流出=EndingBalance,而StartingBalance第一行当然是0,否则它的:StartingBalance=昨天的EndingBalance为迟到的原因抱歉ply…假期和所有。我得到了这个查询:
选择日期(todaydata.postdate)作为postdate,求和(当todaydata.amount>0那么todaydata.amount ELSE 0结束时的情况)作为流入,求和(当todaydata.amount<0那么todaydata.amount ELSE 0结束时的情况)作为从发票流出的今天的数据,将发票作为昨天的数据加入到今天的数据中。postdate=DATE\u添加(昨天的数据。postdate,间隔-1天)按日期分组(今天的数据。postdate)
stackoverflow!哈哈,我很难让StartingBalance和EndingBalance正常工作。EndingBalance相当于:StartingBalance+流入+流出=EndingBalance,而StartingBalance第一行当然是0,否则它的:StartingBalance=昨天的EndingBalance我同意这一点最好但遗憾的是,我不能建议将表拆分为两个表。这不是我在项目中的范围。虽然最终可能会采用这条路径。我同意这将是最好的,但遗憾的是,我不能建议将表拆分为两个表。不是我在项目中的范围。尽管最终可能会采用这条路径。