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