最初に合計を作成し、次に参加します。このように:
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 )副選択してから合計します。