我需要一些小帮助来优化我的查询。它工作正常,但我认为它可以进一步改善。
我们有一个tblExpenses表和tblApproval表。当员工向办公室提交费用时,它将被添加到tblExpense,当办公室工作人员将其提交给管理层时,它将被添加到tblApproval。当管理层批准或拒绝时,它将在批准中标记为状态字段,即
1 - >新的,2 - >查询,3>付费,4>拒绝
我们将批准表ID存储在费用表中。如果批准标识为空,则不提交给管理层。我想找出
我们为每个类别编写了查询
我必须加入这3个查询结果。无论如何,我可以写一个查询
tblExpense
(define (summer n)
(if (positive? n)
(+ n (summer(- n 1)))
0))
tblApproval
*---------------------------------*
| 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 |
*---------------------------------*
答案 0 :(得分:1)
您可以使用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