Как создать последовательность выбранных значений в MySQL?

Я пытаюсь создать запрос, который выберет команду из объявленной переменной, а затем сделает оставшиеся команды "анонимными", дав им общие бренды и последовательные идентификаторы.

Например, если в моем наборе данных есть 3 разных имени команды (ABC, DEF и GHI), но мне бы хотелось, чтобы отображалось только истинное значение 1 выбранной команды (ABC). Вот скелет запроса, с которым я работаю:

SET @teamid = 123;

SELECT     CASE WHEN ID = @teamid
                THEN NAME
                ELSE 'Team' + ' - ' + SEQ
                END AS 'Team Name',
           SUM(TOTAL) AS 'Team Total'
FROM       TEAM
GROUP BY   1;

Я хотел бы, чтобы результаты выглядели примерно так:

 Team Name:    Team Total:
 ABC           100
 Team - 1      50
 Team - 2      150

Как я могу создать запрос, который создаст уникальный номер, которым я могу заменить исходное название команды? Я знаю, что должен заменить часть "SEQ" в выражении case, но я не уверен, что именно заменить его. Кроме того, важно, чтобы у каждой команды был один и тот же идентификатор, независимо от того, является ли он анонимным (если команда DEF имеет 50 строк, она должна отображаться как команда- 1, а не как команда- 1-50), чтобы мои группировки работать должным образом.

Спасибо за помощь.

2 ответа

Решение

Используйте пользовательскую переменную, которую вы увеличиваете. Кроме того, MySQL использует CONCAT объединять строки, а не +,

SET @teamid = 123;

SELECT     CASE WHEN ID = @teamid
                THEN NAME
                ELSE CONCAT('Team  - ', @SEQ)
                END AS 'Team Name',
           SUM(TOTAL) AS 'Team Total',
           @SEQ := CASE WHEN ID = @teamid 
                        THEN @SEQ
                        ELSE @SEQ + 1
                   END
FROM       TEAM
CROSS JOIN (SELECT @SEQ := 1) AS vars
GROUP BY   ID;

DEMO

Это должно работать. Внутренний запрос создает псевдонимы команд, увеличивая счетчик только при изменении имени. Внешний использует эти имена для группировки.

SET @teamid := [the id you want];
SET @prevName := "";
SET @team_i := 0;

SELECT `Team Name`, SUM(TOTAL) AS `Team Total`
FROM (
   SELECT @team_i := @team_i + IF(@prevName <>NAME, 1, 0) AS `teamIndex`
      , @prevName := NAME AS `OriginalName`
      , IF(ID = @teamid, NAME, CONCAT('Team  - ', @team_i)) AS `Team Name`
      , TOTAL
   FROM TEAM
   ORDER BY NAME) AS subQ
GROUP BY `Team Name`;

и на самом деле, он, вероятно, может быть полностью изменен (и этот может быть немного быстрее, хотя в конечном итоге вы получите дополнительные поля):

SET @teamid := [the id you want];
SET @prevName := "";
SET @team_i := 0;

SELECT @team_i := @team_i + IF(@prevName <>NAME, 1, 0) AS `teamIndex`
      , @prevName := NAME AS `OriginalName`
      , IF(ID = @teamid, NAME, CONCAT('Team  - ', @team_i)) AS `Team Name`
      , `Team Total`
FROM (
   SELECT `NAME`, SUM(TOTAL) AS `Team Total`
   FROM TEAM
   GROUP BY NAME) AS subQ
ORDER BY `NAME`;
Другие вопросы по тегам