2017-04-04 143 views
0

我正在开发一个研究所的LMS系统 ,我正在努力在月底制定一份恢复报告 报告中包含学生姓名总费用包,总收到,总可接受,当月未决批两列两列的总和mysql mysql

这里是学生与他录取ID enter image description here

分期付款的数据,这是从哪儿ICAN挑费包和总receiveable费

01底帐数据

,我使用这个查询恢复报告

SELECT 
SUM(l.dr)-SUM(l.cr) as sum_remaining, 
f.dr as fee_package, 
SUM(i.payment) as this_month_install, 
a.reg_id, s.fname 
FROM 
ledger l, ledger f, student_data s, 
admissions a LEFT OUTER JOIN installments i ON a.admissionid = i.admissionid 
WHERE 
a.admissionid = '58ac4b5421488' AND 
a.reg_id = s.reg_id AND 
l.reference = '58ac4b5421488' AND 
l.details <> 'registration fee' AND 
f.reference = '58ac4b5421488' AND 
f.details = 'Fee Package' AND 
i.install_no <> '1' AND 
MONTH(i.pay_date) = '04' AND 
YEAR(i.pay_date) = '2017' 
GROUP BY a.admissionid 

及其给结果这样

enter image description here

但结果应该是像

sum_remaining = 10000 和this_month_install = 10000 请帮忙我理清这个问题提前

+0

请注意'JOIN' +'GROUP_BY' - 通常会导致“COUNTs”和“SUMs”膨胀。 –

+0

那我该怎么做。 –

+0

首先,了解每个“JOINs”是多少:很多还是1:多。然后尝试使用最少数量的“JOIN”来获得每个“SUM”,如果可能的话,为零。这可能涉及一些子查询。 –

回答

0

我有一个子查询做到了这一点 感谢所有

select a.admissionid, s.fname, 
sum(l.dr)-SUM(l.cr) as sum_remaining, i.*, 
f.dr as fee_package from student_data s, 
ledger l, ledger f, admissions a 
RIGHT outer join (select admissionid, 
sum(payment) as this_month_install 
from 
installments g where g.install_no <> '1' and MONTH(g.pay_date) = '04' and YEAR(g.pay_date) = '2017' group by g.admissionid) i 

ON 
i.admissionid = a.admissionid where a.reg_id = s.reg_id and 
a.status = 'studying' and a.course = 'PH' and 
a.campus = 'CIFSD01' and l.reference = a.admissionid and 
l.details <> 'registration fee' and f.reference = a.admissionid 
and f.details = 'Fee Package' GROUP BY a.std_id 
1

感谢您应该从入院开始,并使用内部连接的其他表(左连接分期付款)

SELECT 
    SUM(l.dr)-SUM(l.cr) as sum_remaining, 
    f.dr as fee_package, 
    SUM(i.payment) as this_month_install, 
    a.reg_id, 
    s.fname 
    FROM admissions a 
    Inner JOIN ledger f ON f.reference = a.admissionid AND f.details = 'Fee Package' 
    INNER JOIN ledger l ON l.reference = a.admissionid AND l.details <> 'registration fee' 
    INNER JOIN student_data s ON a.reg_id = s.reg_id 
    LEFT JOIN installments i ON a.admissionid = i.admissionid AND i.install_no <> '1' 
    WHERE a.admissionid = '58ac4b5421488' 
    AND MONTH(i.pay_date) = '04' 
    AND YEAR(i.pay_date) = '2017' 
    GROUP BY a.admissionid 

你有两个行分期付款表匹配。 。尽量过滤器只是一个

SELECT 
SUM(l.dr)-SUM(l.cr) as sum_remaining, 
f.dr as fee_package, 
SUM(i.payment) as this_month_install, 
a.reg_id, 
s.fname 
FROM admissions a 
Inner JOIN ledger f ON f.reference = a.admissionid AND f.details = 'Fee Package' 
INNER JOIN ledger l ON l.reference = a.admissionid AND l.details <> 'registration fee' 
INNER JOIN student_data s ON a.reg_id = s.reg_id 
LEFT JOIN installments i ON a.admissionid = i.admissionid 
         AND i.install_no not in ('1', '2') 
WHERE a.admissionid = '58ac4b5421488' 
AND MONTH(i.pay_date) = '04' 
AND YEAR(i.pay_date) = '2017' 
GROUP BY a.admissionid 
+0

仍然得到这个答案 –

+0

答案更新了一个建议..让我知道 – scaisEdge

+0

我已经做了这个与子查询谢谢 –