如何根据 MySQL 中的选定值创建序列?
How to create a sequence on selected values in MySQL?
我正在尝试创建一个查询,该查询将从声明的变量 select 一个团队,然后通过为他们提供通用品牌和顺序 ID 使剩余的团队 "anonymous"。
例如,如果我的数据集有 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
我如何着手创建一个查询来创建一个唯一的编号,我可以用它来替换原来的团队名称?我知道我必须替换 case 语句的 "SEQ" 部分,但我不确定究竟用什么替换它。此外,重要的是每个团队都有相同的 ID,无论它是否是匿名的(所以如果团队 DEF 有 50 行,它应该显示为 Team - 1 only 而不是 Team - 1-50)这样我的分组就会正常工作。
感谢您的帮助。
使用您递增的用户定义变量。此外,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`;
我正在尝试创建一个查询,该查询将从声明的变量 select 一个团队,然后通过为他们提供通用品牌和顺序 ID 使剩余的团队 "anonymous"。
例如,如果我的数据集有 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
我如何着手创建一个查询来创建一个唯一的编号,我可以用它来替换原来的团队名称?我知道我必须替换 case 语句的 "SEQ" 部分,但我不确定究竟用什么替换它。此外,重要的是每个团队都有相同的 ID,无论它是否是匿名的(所以如果团队 DEF 有 50 行,它应该显示为 Team - 1 only 而不是 Team - 1-50)这样我的分组就会正常工作。
感谢您的帮助。
使用您递增的用户定义变量。此外,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`;