Mysql
 sql >> Baza danych >  >> RDS >> Mysql

łączenie wyniku zapytania mysql SUM() za pomocą złączenia wewnętrznego

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC Create Table Przykładowa instrukcja użycia

  2. MySQL Wybierz wiersze, w których kolumna sygnatury czasowej od teraz do 10 minut temu

  3. mysql select optymalizacja zapytań i jak działa limit w mysql

  4. Wordpress aktualizuje tabelę mysql

  5. Jak wygenerować unikalną losową wartość dla każdego użytkownika w laravelu i dodać ją do bazy danych?