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.