MySQL查询从不同的表中扣除两个字段

时间:2018-06-20 05:35:39

标签: mysql

我想实现一个查询,使学生(基于搜索)获得的总余额是评估表减去付款表中的金额。


学生姓名-花费(评估)-已支付(付款)-余额总计


表1:学生 id,名字,姓氏,中间名,idno

Sample Data
1, a, a, a, 18001
2, b, b, b, 18002

表2:评估 ID,学生ID,金额

Sample Data
1, 1, 500
2, 1, 600
3, 2, 100
4, 2, 100

表3:付款 ID,学生ID,金额

Sample Data
1, 1, 200
2, 1, 100

结果必须为:

student, assessment, payment, balance
a, 1100, 200, 900
b, 200, 100, 100

这是我当前的查询...,没有得到预期的结果。

$qry = "SELECT c.*, SUM(CASE WHEN x.type = 'assessment' THEN x.amount ELSE 0 END) spent
                             , SUM(CASE WHEN x.type = 'payments' THEN x.amount ELSE 0 END) paid
                             , SUM(CASE WHEN x.type = 'assessment' THEN x.amount ELSE x.amount * -1 END) total
                          FROM students c
                          LEFT JOIN 
                             ( SELECT studentid
                                    , 'assessment' type
                                    , amount
                                 FROM assessment 
                                UNION
                               SELECT studentid
                                    , 'payments'
                                    , amount
                                 FROM payment 
                             ) x
                            ON x.studentid = c.id
                         WHERE ((c.firstname like '%$search%' or c.lastname like '%$search%' or c.middlename like '%$search%' or c.idno like '%$search%') and c.status = 1)
                         GROUP
                            BY c.id;";

1 个答案:

答案 0 :(得分:0)

在每个子表中为每个学生的每个子表中的金额求和,然后将这些子句与您的主查询结合起来

SELECT c.*,
  COALESCE(a.amount,0) assessment,
  COALESCE(p.amount,0) payment,
  COALESCE(a.amount,0) - COALESCE(p.amount,0) balance
FROM students c
LEFT JOIN (SELECT studentid, SUM(amount) amount 
           FROM assessment
           GROUP BY studentid
) a ON c.id = a.studentid
LEFT JOIN(SELECT studentid, SUM(amount) amount
          FROM payment
          GROUP BY studentid         
) p ON c.id = p.studentid
WHERE ((c.firstname like '%$search%' 
        OR c.lastname like '%$search%' 
        OR c.middlename like '%$search%' 
        OR c.idno like '%$search%') 
       AND c.status = 1)

Demo

相关问题