0

我的帐户具有与其关联的类别和订单表,其中订单可以是基于“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 年计算付款的日期,但如果没有付款,我还想显示所有类别为零。

我以错误的方式接近它吗?

如果有人知道任一问题或两者的解决方案,请提供您的解决方案。

4

2 回答 2

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,因此它不会排除没有付款的类别。

于 2013-01-14T16:57:23.593 回答
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

但我建议澄清您的数据库架构,以便您的客户是否已付清或欠债更加明显。

于 2013-01-14T16:43:17.737 回答