Mysql получить сумму двух столбцов таблицы сгруппированы - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть 3 таблицы:

enter image description here

enter image description here

enter image description here

Я бы хотел выбрать разницу между общим выигрышем и общим расходом на пользователя.Таким образом, моя гипотетическая таблица может быть такой:

enter image description here

Я попробовал это:

SELECT g.total - s.total AS quantity, id FROM
(SELECT SUM(quantity) AS total FROM gain GROUP BY user) AS g,
(SELECT SUM(quantity) AS total FROM spent GROUP BY user) AS s, users

Но это не работает ...

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Вам необходимо использовать таблицу users в качестве базовой таблицы, чтобы иметь возможность учитывать всех пользователей, а затем LEFT JOIN для подзапросов, вычисляющих общую затраченную и общую прибыль.Это связано с тем, что некоторые пользователи могут не иметь записи ни в таблице выигрышей, ни в потраченных таблицах.Кроме того, функция Coalesce() обрабатывает NULL (в случае отсутствия соответствующей строки)

SELECT 
  u.id AS user, 
  COALESCE(tot_gain, 0) - COALESCE(tot_spent, 0) AS balance 
FROM users AS u 
LEFT JOIN (SELECT user, SUM(quantity) as tot_spent 
           FROM spent 
           GROUP BY user) AS s ON s.user = u.id
LEFT JOIN (SELECT user, SUM(quantity) as tot_gain 
           FROM gain 
           GROUP BY user) AS g ON g.user = u.id
0 голосов
/ 22 сентября 2019

Решение Мадхура в порядке.Альтернативой является union all и group by:

select user, sum(gain) as gain, sum(spent) as spent
from ((select user, quantity as gain, 0 as spent
       from gain
      ) union all
      (select user, 0, quantity as spent
       from spent
      )
     ) u
group by user;

. Вы можете join до user, если вы хотите, чтобы пользователи отсутствовали ни в одной таблице, или вам нужны дополнительные столбцы.Тем не менее, join может быть необязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...