2017-04-04 103 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

我已經做了這個與子查詢謝謝 –