最初に合計を作成し、次に参加します。このように:
SELECT i.uid
,i.date
,i.v_in
,COALESCE(o.v_out, 0) AS v_out
,(i.v_in - COALESCE(o.v_out, 0)) AS balance
FROM (
SELECT date
,uid
,SUM(value_in) AS v_in
FROM table1
GROUP BY 1,2
) i
LEFT JOIN (
SELECT date
,uid
,SUM(value_out) AS v_out
FROM table2
GROUP BY 1,2
) o USING (date, uid)
あなたがそれを持っていた方法、すべてのvalue_in
一致するすべてのvalue_out
と組み合わされます 、それによって数を掛けます。最初に集約してから、1つに参加する必要があります 1つとの合計 アウトサムとすべてがグルーヴィーです。それともそうですか?
value_in
がない場合はどうなりますか またはvalue_out
特定の(date, uid)
に対して ?または、value_in
のみ または、value_out
?クエリは失敗します。
LEFT JOIN
を使用して改善しました [INNER] JOIN
の代わりに 、しかしあなたが本当に欲しいのはFULL OUTER JOIN
--MySQLに欠けている機能の1つ。
別のテーブルで日のリストを提供するか、LEFT JOIN
両方のテーブルを使用するか、不足している機能を2回LEFT JOIN
で回避できます。 およびUNION
。 こちらをご覧ください例
。
または value_out
を増やすことができます -1
による UNIONは両方のテーブルを一緒にして、1つの合計を作成します。
しかし、あなたはまだ value_in
がないと1日の行は取得されません またはvalue_out
、これはあなたの説明に違反します。
したがって、唯一のクリーンなソリューション すべての(date, uid)
を含むテーブルを作成することです 結果とLEFT JOIN
に必要なもの table1
の合計 およびtable2
それに、またはUNION ALL
3つ(負のtable2
)副選択してから合計します。