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.