我需要一个小的帮助来优化我的查询。它工作得很好,但我认为可以改进得更多。
我们有一张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

09-30 19:47