sql >> Databáze >  >> RDS >> Mysql

kombinování výsledku mysql dotazu SUM() pomocí vnitřního spojení

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.



  1. Vytvoření postgresql DB pomocí psycopg2

  2. Jak předám seznam jako parametr v uložené proceduře?

  3. Proč se mi u mého PHP stále zobrazuje chyba 500?

  4. PostgreSQL anonymizace na vyžádání