![](/img/trans.png)
[英]how to create a MySql query to display running balance from credit and debit where multiple customers have indivdual balances
[英]mySQL debit credit balances
是否可以使用mySQL查询来获取这些字段的旧余额(我的支出总和),借方(我应该在这里将具有相同id的总支出放在当前日期),贷方(在这些查询中没有多少),新余额(与借记相同)。
现在,当一天结束时,新余额将添加到旧余额中,并且将为当前日期形成新余额。 我有我的代码,但它不计算我以前的余额。
表:rf_expenses
--------------------------------------
id_rf_expenses rf_expense_desc
--------------------------------------
1 salary
2 bonus
3 transportation
表:费用
-----------------------------------------------------------
id_expnses id_rf_expenses expense_amt expense_date
------------------------------------------------------------
1 1 100 current
2 1 100 yesterday
3 2 50 current
4 2 50 current
5 3 200 yesterday
输出:
-----------------------------------------------------------
EXPENSE OLD BALANCE DEBIT CREDIT NEW BALANCE
-----------------------------------------------------------
SALARY 100 100 0 100
BONUS 0 100 0 100
TRANSPO 200 0 0 0
这将对当前日期进行每次查询。.当前日期之前的任何日期都将在旧余额中汇总
SELECT
r.rf_expense_desc,
COALESCE(SUM(expense_amt), 0) - COALESCE(q1.amt2, 0) OLD,
COALESCE(q1.amt2, 0) AS NEW
FROM
rf_expenses r
LEFT JOIN
expenses e ON r.id_RF_expense = e.id_rf_expense
LEFT JOIN
(SELECT
SUM(expense_amt) amt2, id_expense,
rf_expenses.id_rf_expense
FROM
rf_expenses
LEFT JOIN
expenses ON rf_expenses.id_RF_expense = expenses.id_rf_expense
WHERE
expense_date = CURDATE( )
GROUP BY
rf_expense_desc, expense_date) q1 ON r.id_rf_expense = q1.id_rf_expense
GROUP BY
rf_expense_desc
嗨,我给出了两个查询:一个查询与日期类型列,另一个查询与字符串。
1查询(带有示例数据) SQLFIDDLE示例 :
SELECT
rf.rf_expense_desc as EXPENSE
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date != 'current'
) AS 'OLD BALANCE'
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date = 'current'
) AS 'DEBIT'
,0 AS CREDIT
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date = 'current'
) AS 'NEW BALANCE'
FROM
rf_expenses rf
2查询(数据类型为日期) SQLFIddle example2 :
SELECT
rf.rf_expense_desc as EXPENSE
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date != CURDATE()
) AS 'OLD BALANCE'
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date = CURDATE()
) AS 'DEBIT'
,0 AS CREDIT
,(SELECT
COALESCE(SUM(e.expense_amt),0)
FROM expenses e
WHERE e.id_rf_expenses= rf.id_rf_expenses
AND expense_date = CURDATE()
) AS 'NEW BALANCE'
FROM
rf_expenses rf
结果:
| EXPENSE | OLD BALANCE | DEBIT | CREDIT | NEW BALANCE |
---------------------------------------------------------------
| salary | 100 | 100 | 0 | 100 |
| bonus | 0 | 100 | 0 | 100 |
| transportation | 200 | 0 | 0 | 0 |
mysql为什么要强制所有GROUP BY子句的SELECT仅具有GROUP BY子句中指定的列或由聚合函数包围的列的另一个示例。 Mysql将此错误称为“功能”。
我的意思是,看看两个GROUP BY的SELECT子句,内部查询和外部查询都一样。 您选择的列不在GROUP BY子句中,并且不被SUM,AVG,COUNT或其他聚合函数包围。 如果将行分组,并且不告诉mysql如何“减少”组中的行,它将简单地随机获取任何值。
例如,假设我们将这些数据存储在名为“ test”的表中:
PARENTID ID VALUE
-------------------------
1 1 2.05
1 2 3.50
1 3 1.58
2 1 4.65
2 2 0.65
我们查询:SELECT父标识,值FROM测试GROUP BY父标识,值
好吧,我们还没有说要对VALUE列进行处理,例如,对SUM进行处理,因此mysql将简单地获取组中的任何值,对于PARENTID = 1,我们可能会获得2.05、3.50或1.58中的任何一个...但不能合并很多。
所以这是正确的:
SELECT parentid, SUM(value) as total FROM test GROUP BY parentid, value;
现在,当mysql减少每个组时,我们得到正确的总和,我们的结果是:
PARENTID VALUE
-------------------------
1 7.13
2 5.30
因此,在您的示例中,您可能要查询:
SELECT r.rf_expense_desc, expense_date,
COALESCE( SUM( expense_amt ) , 0 ) - COALESCE( sum(q1.amt2), 0 ) OLD, COALESCE( sum(q1.amt2), 0 ) AS NEW
FROM rf_expenses r
LEFT JOIN expenses e ON r.id_RF_expense = e.id_rf_expense
LEFT JOIN (
SELECT SUM( expense_amt ) amt2, count(id_expense) as counts
FROM rf_expenses
LEFT JOIN expenses ON rf_expenses.id_RF_expense = expenses.id_rf_expense
WHERE expense_date = CURDATE( )
GROUP BY rf_expense_desc, expense_date
) q1 ON r.id_rf_expense = q1.id_rf_expense
GROUP BY rf_expense_desc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.