Mysql分组基于两个表

时间:2018-02-04 21:51:11

标签: mysql grouping

我需要一些小帮助来优化我的查询。它工作正常,但我认为它可以进一步改善。

我们有一个tblExpenses表和tblApproval表。当员工向办公室提交费用时,它将被添加到tblExpense,当办公室工作人员将其提交给管理层时,它将被添加到tblApproval。当管理层批准或拒绝时,它将在批准中标记为状态字段,即

1 - >新的,2 - >查询,3>付费,4>拒绝

我们将批准表ID存储在费用表中。如果批准标识为空,则不提交给管理层。我想找出

  1. 有多少未提交,已提交,查询,已提交,已拒绝
  2. 我们为每个类别编写了查询

    1. 从tblExpenses中选择sum(amt),其中Apprid为null - >未提交
    2. 从tblExpenses中选择sum(amt),其中Apprid不为null - >提交
    3. sum(amt),状态来自tblExpenses exp内部联接tblApproval appr on appr.apprID = exp.apprID group by status - >未提交
    4. 我必须加入这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   |
      *---------------------------------*
      

1 个答案:

答案 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