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 ))

すべての金額がマイナスだったため、正しい結果が得られませんでした。

2番目の問題:

支払いが行われなかったカテゴリは表示されません。ここでの制限要因は、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

年の小切手は、WHEREではなくJOIN状態である必要があるため、支払いのないカテゴリは除外されません。

于 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 に答える