我需要一个小的帮助来优化我的查询。它工作得很好,但我认为可以改进得更多。
我们有一张tblExpenses表和tblApproval表。当员工向办公室提交费用时,将其添加到tblExpense中;当办公室员工向管理层提交费用时,将其添加到tblApproval中。当管理层批准或拒绝时,它将在批准ie中标记为状态字段
1->新建,2->查询,3->付款,4->拒绝
我们正在费用表中存储审批表id。如果批准id为空,则不会将其提交给管理层。我想知道
有多少未提交、提交、查询、提交、拒绝
我们为每个类别编写了查询
从tblExpenses中选择sum(amt),其中Apprid为空-->表示未提交
从tblExpenses中选择sum(amt),其中Apprid不为空-->用于提交
sum(amt),来自tblExpenses exp inner join tblApproval appr on appr.apprID=exp.apprID group by status-->的状态,用于未提交
我必须加入这3个查询以获得结果。不管怎样,我可以在一个查询中写入
特莱克斯彭斯
*---------------------------------*
| Empid | ExpNo | amt | ApprId |
|-------|---------|------|--------|
| 001 | 456 | 3000 | null | --> Unsubmitted
| 002 | 457 | 200 | 1 | --> Approval ID
| 003 | 458 | 500 | 2 |
| 004 | 459 | 2500 | 3 |
| 005 | 500 | 450 | 4 |
| 006 | 501 | 453 | null |
*---------------------------------*
待定
*---------------------------*
| ApprID | Date | Status |
|--------|--------|---------|
| 1 | xxxxxx | 1 |
| 2 | xxxxxx | 2 |
| 3 | xxxxxx | 3 |
| 4 | xxxxxx | 2 |
*---------------------------*
最佳答案
您可以在一个查询中使用IF
控制流函数来执行此操作,其中定义基于APPRID存在和/或状态信息的求和规则:
SELECT
SUM(IF(e1.ApprID IS NULL, e1.amt, 0)) AS 'Unsubmitted',
SUM(IF(e1.ApprID IS NOT NULL, e1.amt, 0)) AS 'Submitted',
SUM(IF(e1.ApprID IS NOT NULL AND a.Status = 1, e1.amt, 0)) AS 'New',
SUM(IF(e1.ApprID IS NOT NULL AND a.Status = 2, e1.amt, 0)) AS 'Query',
SUM(IF(e1.ApprID IS NOT NULL AND a.Status = 3, e1.amt, 0)) AS 'Paid',
SUM(IF(e1.ApprID IS NOT NULL AND a.Status = 4, e1.amt, 0)) AS 'Rejected'
FROM tblExpense AS e1
LEFT JOIN tblApproval AS a ON e1.ApprID = a.ApprID;
给出以下结果:
| Unsubmitted | Submitted | New | Query | Paid | Rejected |
| 3453 | 3650 | 200 | 950 | 2500 | 0 |
见DEMO