2013-10-28 89 views
0

考慮以下MySQL的聲明:多CASE語句與否定

SELECT costs.cost AS package, payments.cost AS labs, patients.fname, patients.lname, patients.sname, visit.id AS visitid, patients.id, pharm_payments.cost AS pharm_costs ,costs.cost+payments.cost+pharm_payments.cost AS total_cost , 
CASE pharm_payments.cost WHEN pharm_payments.visitid=visit.id THEN pharm_payments.cost 
WHEN pharm_payments.visitid != visit.id THEN 0 
CASE costs.cost WHEN cost.visitid=visit.id THEN costs.cost 
WHEN costs.visitid != visit.id THEN 0 
FROM costs 
LEFT JOIN visit ON costs.visitid = visit.id 
LEFT JOIN patients ON visit.patientid = patients.id 
LEFT JOIN pharm_payments ON pharm_payments.visitid = visit.id 
LEFT JOIN payments ON payments.visitid = visit.id 
WHERE costs.paid = 'not paid' 
AND visit.VisitDate >= CURDATE() 
LIMIT 0 , 30 

從查詢期望的結果應該是訪問ID是哪裏不一樣,它應該返回零值。我不斷收到以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE costs.cost WHEN cost.visitid=visit.id THEN costs.cost WHEN costs.visitid !=' at line 4 

如何解決此錯誤?

+1

我不確定'WHEN/THEN',但它看起來像你可以更容易地實現這個'IF(condition,when_true,when_false)' – Halcyon

+0

爲什麼你在我這裏? –

+0

你忘了閱讀[CASE'的文檔](http://dev.mysql.com/doc/refman/5.7/en/case.html)嗎?語法是_right there_。真的很難錯過。 –

回答

0

我想你case語句應該是這樣的:

....... 
CASE 
    WHEN pharm_payments.visitid=visit.id 
    THEN pharm_payments.cost 
    ELSE 0 
END AS Column1, 
CASE 
    WHEN cost.visitid=visit.id 
    THEN costs.cost 
    ELSE 0 
END AS Column2 

更新

總結他們你可以這樣做:

....... 
(
    CASE 
     WHEN pharm_payments.visitid=visit.id 
     THEN pharm_payments.cost 
     ELSE 0 
    END 
) 
+ 
(
    CASE 
     WHEN cost.visitid=visit.id 
     THEN costs.cost 
     ELSE 0 
    END 
)AS total 
+0

非常感謝@Arion有什麼方法可以總結兩個案例的結果,即Column1和Column2? –

+0

@ user689017:更新答案 – Arion

0
SELECT 
    costs.cost AS package, 
    payments.cost AS labs, 
    patients.fname, 
    patients.lname, 
    patients.sname, 
    visit.id AS visitid, 
    patients.id, 
    pharm_payments.cost AS pharm_costs, 
    costs.cost + payments.cost + pharm_payments.cost AS total_cost, 
    CASE 
    pharm_payments.cost 
    WHEN pharm_payments.visitid = visit.id 
    THEN pharm_payments.cost 
    WHEN pharm_payments.visitid != visit.id 
    THEN 0 END AS pharm_payments_cost, 
    CASE 
     costs.cost 
     WHEN cost.visitid = visit.id 
     THEN costs.cost 
     WHEN costs.visitid != visit.id 
     THEN 0 END AS costs_cost 
FROM 
    costs 
    LEFT JOIN visit 
    ON costs.visitid = visit.id 
    LEFT JOIN patients 
    ON visit.patientid = patients.id 
    LEFT JOIN pharm_payments 
    ON pharm_payments.visitid = visit.id 
    LEFT JOIN payments 
    ON payments.visitid = visit.id 
WHERE costs.paid = 'not paid' 
    AND visit.VisitDate >= CURDATE() 
LIMIT 0, 30