Najpierw zbuduj sumę, a następnie dołącz. Tak:
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)
Tak jak to masz, każda value_in zostaną połączone z każdym pasującym value_out , mnożąc w ten sposób liczby. Najpierw musisz się zagregować, a następnie dołączyć do jednego suma z jeden suma i wszystko jest fajne. Czy to prawda?
Co się stanie, jeśli nie ma value_in lub value_out dla danego (date, uid) ? Lub tylko value_in Lub po prostu value_out ? Twoje zapytanie nie powiedzie się.
Poprawiłem się za pomocą LEFT JOIN zamiast [INNER] JOIN , ale tak naprawdę chcesz FULL OUTER JOIN - jedna z brakujących funkcji w MySQL.
Możesz podać listę dni w osobnej tabeli i LEFT JOIN do obu tabel lub możesz obejść brakującą funkcję za pomocą dwukrotnego LEFT JOIN i UNION . Zobacz tutaj na przykład
.
Lub możesz pomnożyć swój value_out przez -1 POŁĄCZ obie tabele razem i zbuduj jedną sumę.
Ale ty nadal nie dostałby wiersza przez dzień bez value_in lub value_out , co narusza Twój opis.
Tak więc jedyne czyste rozwiązanie jest mieć tabelę ze wszystkimi (date, uid) chcesz w wyniku i LEFT JOIN sumy table1 i table2 do niego lub UNION ALL trzy (ujemne table2 ) w podselekcji, a następnie podsumuj.