我正在尝试跟随查询...
SELECT b.name AS batch_name, b.id AS batch_id,
COUNT( s.id ) AS total_students,
COALESCE( sum(s.open_bal), 0 ) AS open_balance,
sum( COALESCE(i.reg_fee,0) + COALESCE(i.tut_fee,0) + COALESCE(i.other_fee,0) ) AS gross_fee
FROM batches b
LEFT JOIN students s on s.batch = b.id
LEFT JOIN invoices i on i.student_id = s.id
GROUP BY b.name, b.id;
结果集
| batch_name | batch_id | total_students | open_balance | gross_fee |
+------------+-----------+----------------+--------------+-----------+
| ba | 11 | 44 | 0 | 1782750 |
+------------+-----------+----------------+--------------+-----------+
但它提供的是未结果的结果,如果我删除了sum( COALESCE(i.reg_fee,0) + COALESCE(i.tut_fee,0) + COALESCE(i.other_fee,0) ) AS gross_fee
和LEFT JOIN fm_invoices i on i.student_id = s.id
,它会给出预期/正确的结果,如下所示......
| batch_name | batch_id | total_students | open_balance | gross_fee |
+------------+-----------+----------------+--------------+-----------+
| ba | 11 | 34 | 0 | 0 |
+------------+-----------+----------------+--------------+-----------+
我确信,我正在做一些事情,我正在尝试自上个一小时以来的所有选择,请帮忙。
答案 0 :(得分:0)
我认为你的问题是:
为什么
COUNT(s.id)
在第一个查询中返回44,在第二个查询中返回34,如何在同一查询中对发票求和时,如何计算34个学生?
您的一些学生有多张发票,而且联接会产生多行s.id
。当你计算它们时,它会计算这些多行中的每一行。
您应该使用COUNT(DISTINCT s.id)
使查询只对每个学生ID进行一次计数,即使由于加入发票而多次出现也是如此。
重新提出有关更改内容的问题,只需将COUNT(s.id)
更改为COUNT(DISTINCT s.id)
即可。如果我对你想要它做什么有正确的理解,那么查询的其余部分看起来很好。