Как вернуть общее количество строк на основе значения столбца, которое сгруппировано, приведенный ниже код работает и печатает отдельные команды с их владельцами элементов, но общее количество_членов неверно и примерно в 10 раз выше, чем на самом деле, похоже, что каждый СЛУЧАЙ, КОГДА, умножает количество строк.
Вот мой код:
SELECT
team.team_name,
team_rank.points,
SUM(CASE WHEN items.item_id = 1 THEN items.count END) AS item1,
SUM(CASE WHEN items.item_id = 2 THEN items.count END) AS item2,
SUM(CASE WHEN items.item_id = 3 THEN items.count END) AS item3,
SUM(CASE WHEN items.item_id = 4 THEN items.count END) AS item4,
COUNT(member.team_id) AS total_members
FROM
member
INNER JOIN
items ON member.obj_Id = items.owner_id
INNER JOIN
team ON team.team_id = member.team_id
JOIN
team_rank ON team.team_id = team_rank.team_id
GROUP BY
member.team_id
ниже текущий результат, расчет предметов верен, но на самом деле в команде 1 всего 19 человек, а в команде 2 5, так что это умножается во много раз.
ОТРЕДАКТИРОВАНО:
см. пример данных базы данных, загруженных в скрипку по запросу. https://www.db-fiddle.com/f/gwWCEa3vaPs1JTgBnwk1wM/0
Наверное, вы хотите COUNT(DISTINCT member.team_id)
Я попробовал COUNT DISTINCT, как было предложено, но тогда он возвращает только 1 в каждой строке. Что касается изображения, я попробовал построитель таблиц в стеке, он выглядел хорошо в предварительном просмотре, но после публикации он потерял все свое форматирование и просто распечатался как текст.
Ой, извините, я не принял во внимание группу. Пожалуйста, предоставьте DDL и данные по запросу @erik258.
данные скрипки были добавлены в редактируемую часть. надеюсь, что это поможет устранить неполадки, поскольку это явно повторяющаяся ошибка. Большое спасибо. db-fiddle.com/f/gwWCEa3vaPs1JTgBnwk1wM/0
Я думаю, вы пытаетесь выполнить сводной запрос/таблицу, верно? Нечто подобное описано здесь.
Каков ваш ожидаемый результат для выборки данных в скрипке?
Да, технически это будет вывод сводной таблицы, которого я могу достичь в Excel, но с трудом могу работать с SQL. Ожидаемый результат @forpas точно такой же, как сейчас, но только с правильным total_members, как вы видите в скрипте, теперь он показывает, что в команде 1 34 члена, а в команде 2 39. но всего 22 члена с 11 в каждой команде, так что это ясно неверный и почему-то результат умножается в несколько раз. а в реальной базе данных у меня десятки тысяч строк, поэтому вручную проверить сложно.
Агрегируйте внутри member
, чтобы получить total_members
, и присоедините результаты к запросу:
SELECT
team.team_name,
team_rank.points,
SUM(CASE WHEN items.item_id = 1 THEN items.count END) AS item1,
SUM(CASE WHEN items.item_id = 2 THEN items.count END) AS item2,
SUM(CASE WHEN items.item_id = 3 THEN items.count END) AS item3,
SUM(CASE WHEN items.item_id = 4 THEN items.count END) AS item4,
c.total_members
FROM member
INNER JOIN (SELECT team_id, COUNT(team_id) total_members FROM member GROUP BY team_id) c
ON c.team_id = member.team_id
INNER JOIN items ON member.obj_Id = items.owner_id
INNER JOIN team ON team.team_id = member.team_id
INNER JOIN team_rank ON team.team_id = team_rank.team_id
GROUP BY member.team_id;
Смотрите демо.
большое спасибо, все сработало отлично. Очень ценю ваше время, чтобы помочь.
вы должны сделать это воспроизводимым, предоставив точные DDL и тестовые данные. Может быть, на одном из сайтов скриптов sql в Интернете? Мне нравится минималистичный dbfiddle.uk (без принадлежности)