Неверное получение суммы левого соединения в таблице

#sql #postgresql

Вопрос:

У меня есть два стола

teams_users и summary_coins

пример данных teams_users

 id team_id user_id
1   1       1
2   1       2
3   2       3
 

пример данных summary_coins

 id    team_id    get_count 
 1     2          10         
 2     2           5         
 

Желаемый результат :

 id     team_id   total_user   get_count 
1       2             1        15
2       1             2         0
 

Здесь я пытаюсь подсчитать всех пользователей teams_ с суммой команд монет. Я попробовал ниже sql

 SELECT 
    teams_users.team_id,
    count(teams_users.user_id) as team_users_count,
    sum(summary_coins.get_count) as get_coins_count
from teams_users
    LEFT JOIN summary_coins 
    on summary_coins.team_id = teams_users.team_id
group by summary_coins.team_id,teams_users.team_id
order by teams_users.team_id ASC
 

Я правильно получаю пользователей команды, но сумма монет из сводной таблицы я получаю неправильное значение

 Team_id  team_users_count   coins_sum
3        150                 300
4        22                   77
 

Для team_id 3 у меня есть 30 монет, но в запросе я получаю 300.

Комментарии:

1. вам необходимо предоставить примерные данные и желаемый результат

2. @eshirvana Я обновил свой вопрос.

3. Это вполне возможно. Например, когда количество монет также зависит от идентификатора пользователя, который игнорируется запросом.

Ответ №1:

вот один из способов:

 SELECT 
    teams_users.team_id,
    count(teams_users.user_id) as team_users_count,
    get_coins_count
from teams_users
LEFT JOIN ( select team_id ,sum(summary_coins.get_count) get_coins_count
            from summary_coins 
            group by team_id
    ) summary_coins
    on summary_coins.team_id = teams_users.team_id
group by teams_users.team_id , get_coins_count
order by teams_users.team_id ASC
 

или более читабельный способ:

 select * from ( 
    select team_id , count(*) total_user
    from teams_users
    group by team_id
) u
join (
    select team_id ,sum(summary_coins.get_count) get_coins_count
    from summary_coins 
    group by team_id
) c
on c.team_id = u.team_id
order by team_id ASC

 

Ответ №2:

Пользователи Team_ должны быть объединены в первую очередь

 SELECT 
    tu.team_id, tu.team_users_count,
    sum(summary_coins.get_count) as get_coins_count
from (
  select team_id,
      count(user_id) as team_users_count
  from teams_users
  group by team_id
) tu
LEFT JOIN summary_coins 
    on summary_coins.team_id = tu.team_id
group by tu.team_id, tu.team_users_count
order by tu.team_id ASC
 

Ответ №3:

Если у вас есть:

Пользователи таблиц

 id  Group
1   A
2   A
3   B
4   B
 

Сводная таблица

 idGroup    Coins
A          100
B          150
 

Когда вы запрашиваете:

 select * from users,summary where users.Group=summary.idGroup
 

Вы получаете:

Запрос пользователей-Сводка

 id  Group  Coins
1   A      100
2   A      100
3   B      150
4   B      150
 

Когда вы запрашиваете:

 select group,count(*),sum(coins) from users,summary where users.Group=summary.idGroup group by users.group, summary.coins
 

Вы получаете:

Запрос пользователей-Сводка

 Group  Count(*) Sum(Coins)
A      2        200
B      2        300
 

Тогда…