我想实现一个查询,使学生(基于搜索)获得的总余额是评估表减去付款表中的金额。
学生姓名-花费(评估)-已支付(付款)-余额总计
表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;";
答案 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)