Первые 5 строк суммируются по ссылке для каждого типа, все остальные равны 1, сгруппированы по идентификатору команды

У меня есть оператор SQL, в котором для каждого WSF_REF выбираются первые 5 строк для каждого ТИПА, а ВЕСЫ суммируются, ГДЕ СТАТУС = «Одобрено». Все остальные строки для ссылки на тип классифицируются как 1. Это работает нормально. Я хочу добавить вторую группу TEAMID.

 "SELECT WSF_REF, SUM(WEIGHT)
FROM (SELECT t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT
  FROM test t1
  LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
  WHERE t1.STATUS = 'Approved'
  GROUP BY t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT
  HAVING COUNT(t2.ID) < 5 
  UNION ALL
  SELECT t1.ID, t1.WSF_REF, t1.TYPE, 1
  FROM test t1
  LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
  WHERE t1.STATUS = 'Approved'
  GROUP BY t1.ID, t1.WSF_REF, t1.TYPE
  HAVING COUNT(t2.ID) >= 5) t
GROUP BY WSF_REF";

Пример данных

CREATE TABLE test (
  `ID` INTEGER,
  `WSF_REF` INTEGER,
  `TYPE` VARCHAR(4),
  `WEIGHT` INTEGER,
  `STATUS` VARCHAR(10),
  `TEAMID` VARCHAR(10)
);



INSERT INTO test
  (`ID`, `WSF_REF`, `TYPE`, `WEIGHT`, `STATUS`, `TEAMID` )
VALUES
  ('1', '1', 'Pike', '10', 'Approved', 'Red'),
  ('2', '1', 'Pike', '10', 'Approved', 'Red'),
  ('3', '1', 'Pike', '10', 'Approved', 'Red'),
  ('4', '1', 'Pike', '10', 'Approved', 'Red'),
  ('5', '1', 'Pike', '10', 'Approved', 'Red'),
  ('6', '1', 'Pike', '10', 'Approved', 'Red'),
  ('7', '1', 'Asp', '10', 'Approved', 'Red'),
  ('8', '1', 'Asp', '10', 'Approved', 'Red'),
  ('9', '1', 'Asp', '10', 'Approved', 'Red'),
  ('10', '1', 'Asp', '10', 'Approved', 'Red'),
  ('11', '1', 'Asp', '10', 'Approved', 'Red'),
  ('12', '1', 'Asp', '10', 'Approved', 'Red'),
  ('13', '2', 'Pike', '10', 'Approved', 'Red'),
  ('14', '3', 'Pike', '10', 'Approved', 'Blue');

Предполагаемые результаты

TEAM ID      WEIGHT
---------------------
Red           112
Blue           10

Таким образом, WSF_REF по-прежнему используется для обработки начальных итогов, но GROUP BY должен быть TEAMID.

Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Попробуйте ниже -

ДЕМО

SELECT  TEAMID,SUM(WEIGHT)
FROM (SELECT t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT,t1.TEAMID
  FROM test t1
  LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
  WHERE t1.STATUS = 'Approved'
  GROUP BY t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT,t1.TEAMID
  HAVING COUNT(t2.ID) < 5 
  UNION ALL
  SELECT t1.ID, t1.WSF_REF, t1.TYPE, 1,t1.TEAMID
  FROM test t1
  LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
  WHERE t1.STATUS = 'Approved'
  GROUP BY t1.ID, t1.WSF_REF, t1.TYPE,t1.TEAMID
  HAVING COUNT(t2.ID) >= 5) t
GROUP BY TEAMID

ВЫХОД:

TEAMID  weight
Red     112
Blue    10

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

Похожие вопросы

Как получить сгенерированный внешний ключ, созданный в MySQL, для использования в функции вставки
Ниже приведен код динамической формы, который может вставлять данные, добавляя несколько входных данных от пользователя в строку, но я хочу, чтобы они были в столбце. Как мне это сделать?
Java Spring Boot + Mysql — возвращает ответ Json (ключ-значение), когда результат запроса mysql не соответствует какой-либо модели, соответствующей какой-либо таблице базы данных
Новичок в MySQL Workbench, в чем смысл подключения?
Случай Mysql Switch, возвращающий неверные результаты
Получение ошибки HTTP 500, даже если учетная запись авторизована
Как получить значение столбца в строке с первым вхождением другого значения в определенный столбец в MySQL?
Проверка скрипта с --login-path в Monit дает ОШИБКУ 1045 (28000)
MySQL и PHP не вставляют строки с пробелами или специальными символами
Подготовленный оператор возвращает ошибки номер 0