#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
Тогда…