如何根据 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;

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`;