Как подсчитать строки на основе значения столбца после его группировки по идентификатору

Как вернуть общее количество строк на основе значения столбца, которое сгруппировано, приведенный ниже код работает и печатает отдельные команды с их владельцами элементов, но общее количество_членов неверно и примерно в 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

вы должны сделать это воспроизводимым, предоставив точные DDL и тестовые данные. Может быть, на одном из сайтов скриптов sql в Интернете? Мне нравится минималистичный dbfiddle.uk (без принадлежности)

erik258 02.10.2022 16:02

Наверное, вы хотите COUNT(DISTINCT member.team_id)

Mihe 02.10.2022 16:15

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

Friko 02.10.2022 17:00

Ой, извините, я не принял во внимание группу. Пожалуйста, предоставьте DDL и данные по запросу @erik258.

Mihe 02.10.2022 18:08

данные скрипки были добавлены в редактируемую часть. надеюсь, что это поможет устранить неполадки, поскольку это явно повторяющаяся ошибка. Большое спасибо. db-fiddle.com/f/gwWCEa3vaPs1JTgBnwk1wM/0

Friko 03.10.2022 11:52

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

Sam020 03.10.2022 12:06

Каков ваш ожидаемый результат для выборки данных в скрипке?

forpas 03.10.2022 12:24

Да, технически это будет вывод сводной таблицы, которого я могу достичь в Excel, но с трудом могу работать с SQL. Ожидаемый результат @forpas точно такой же, как сейчас, но только с правильным total_members, как вы видите в скрипте, теперь он показывает, что в команде 1 34 члена, а в команде 2 39. но всего 22 члена с 11 в каждой команде, так что это ясно неверный и почему-то результат умножается в несколько раз. а в реальной базе данных у меня десятки тысяч строк, поэтому вручную проверить сложно.

Friko 03.10.2022 12:31
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
9
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Агрегируйте внутри 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;

Смотрите демо.

большое спасибо, все сработало отлично. Очень ценю ваше время, чтобы помочь.

Friko 03.10.2022 12:46

Другие вопросы по теме

SQLite-запрос JOIN, CONCAT, подзапрос
Как мне сделать так, чтобы в моем операторе SQL отображалась только первая строка (самая низкая цена + общее количество покупок)
Объедините список фреймов данных, сохраняя уникальные имена (избегайте дублирования имен и NA)
Альтернатива левостороннему объединению, которое позволяет выбирать столбцы как из левого, так и из правого фреймов данных
SQL: несколько соединений с несколькими таблицами, где некоторые значения столбцов не являются обязательными
Как заменить значения в шейп-файле полигонов через пространственное соединение в python
Присоединиться к самой последней правой записи, но поместить NULL, если правая таблица не имеет данных
Получение диапазонов произвольных строк в SQL на основе последовательности, продиктованной в отдельной таблице
Как найти ближайшее время?
Обновление таблицы с помощью CTE