Nejprve sestavte součet, pak se připojte. Takhle:
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 jste to měli, každý value_in bude kombinován s každým odpovídajícím value_out , čímž se čísla vynásobí. Nejprve musíte agregovat a poté se připojíte k jednomu v součtu s jedna out-součet a všechno je groovy. Nebo ano?
Co se stane, když nebudou žádné value_in nebo value_out pro daný (date, uid) ? Nebo pouze value_in Nebo jen value_out ? Váš dotaz se nezdaří.
Zlepšil jsem se pomocí LEFT JOIN místo [INNER] JOIN , ale to, co opravdu chcete, je FULL OUTER JOIN - jedna z chybějících funkcí v MySQL.
Můžete buď poskytnout seznam dnů v samostatné tabulce a LEFT JOIN obě tabulky, nebo můžete chybějící funkci obejít dvakrát LEFT JOIN a UNION . Podívejte se zde pro příklad
.
Nebo můžete svou hodnotu value_out vynásobit podle -1 SPOJETE oba stoly dohromady a sestavte jeden součet.
Ale ty pořád bez value_in by nedostal řádek za den nebo value_out , což porušuje váš popis.
Takže jediné čisté řešení je mít tabulku se všemi (date, uid) chcete ve výsledku a LEFT JOIN součty table1 a table2 nebo UNION ALL tři (záporné table2 ) v dílčím výběru a poté shrnout.