我的帐户有与之相关的类别&订单表,其中订单可以是债务或信用,基于“order_type”字段&支付表,存储支付日期和金额(没有用于债务或信用的负数)。
目前我正在使用这样的东西:
SELECT cat, SUM(p.amount) balance
FROM accounts a
LEFT JOIN orders o ON a.id = o.account_id
LEFT JOIN payments p ON o.id = p.order_id
WHERE YEAR(p.date) = 2012
GROUP BY a.cat
第一期:
这会把所有的钱视为错误的付款,我试图使用
sum(IF(o.order_type = 1, p.amount, p.amount * -1 ))
未能给出正确的结果,因为所有金额都是负数。
第二期:
它不会显示没有付款的类别,这里的限制因素是我需要确保我只计算2012年付款的日期,但如果没有付款,我还想显示所有类别的零制成。
我接近错误的方式吗?
如果有人知道这两个问题或两者的解决方案,请提供您的解决方案。
答案 0 :(得分:1)
SELECT cat, SUM(p.amount) balance
FROM accounts a
LEFT JOIN orders o
ON a.id = o.account_id
AND o.order_type = 1
LEFT JOIN payments p
ON o.id = p.order_id
AND YEAR(p.date) = 2012
GROUP BY a.cat
年度检查必须处于JOIN条件,而不是WHERE,因此不会排除没有付款的类别。
答案 1 :(得分:0)
尝试这样的事情:
SELECT cat, SUM(p.amount) balance
FROM accounts a
LEFT JOIN orders o
ON a.id = o.account_id
AND o.order_type = 1
LEFT JOIN payments p
ON o.id = p.order_id
WHERE YEAR(p.date) = 2012
GROUP BY a.cat
但我建议澄清您的数据库架构,以便在您的客户付清或欠债时更明显。