如何在MySQL中创建选定值的序列?

如何在MySQL中创建选定值的序列?,mysql,sequence,case-statement,nextval,Mysql,Sequence,Case Statement,Nextval,我正在尝试创建一个查询,该查询将从声明的变量中选择一个团队,然后通过向其余团队提供通用品牌和顺序ID使其匿名 例如,如果我的数据集有3个不同的团队名称ABC、DEF和GHI,但我只希望显示所选1个团队ABC的真实值。以下是我正在处理的查询的框架: SET @teamid = 123; SELECT CASE WHEN ID = @teamid THEN NAME ELSE 'Team' + ' - ' + SEQ

我正在尝试创建一个查询,该查询将从声明的变量中选择一个团队,然后通过向其余团队提供通用品牌和顺序ID使其匿名

例如,如果我的数据集有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行,则应仅将其显示为团队-1,而不是团队-1-50,以便我的分组正常工作


感谢您的帮助。

使用您递增的用户定义变量。此外,MySQL使用CONCAT连接字符串,而不是+


这应该行得通。内部查询仅通过在名称更改时增加计数器来为团队名称添加别名。外部的一个使用这些名称来分组

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

@MattBusche,这是针对SQL Server的,而不是MySQL.ROWNUM…很有趣,我没有想过要使用它。这将有助于获得一个独特的身份证,但我更希望有一种方法能够提供一个更精简的方法。我可能可以创建一个临时表并连接回团队表,基本上可以修改上面的CASE语句以使用ROWNUM,但是无论如何都可以通过顺序类型的过程来消除该步骤。无论如何,感谢您的回复。@dupton MySQL没有ROWNUM。这个答案是针对SQL Server的,不是针对MySQL的。谢谢Barmar。也注意到您对ROWNUM的评论。您的演示看起来很棒,以前从未见过该站点,非常酷,但当我在MySQL实例上尝试时,我会返回团队名称和SEQ列的blob,我删除了团队总数,只是为了消除一些混乱。知道为什么会这样吗?@SEQ列可以忽略,它只是查询内部需要的。不过,我不知道为什么你的球队名称会有斑点。NAME的数据类型是什么?NAME的数据类型是varchar50。如果我不想将SEQ部分包含在数据中,我如何在团队合计之后隐藏/忽略SEQ部分?抱歉,如果这是一个愚蠢的问题,这对我来说是一个全新的问题。您可以将其放入子查询中,然后外部查询只能选择“团队总数”和“团队名称”列。上面提到的@SEQ的转换修复了BLOB问题,与此查询相同。谢谢Barmar。这看起来也是一个不错的方法,但我面临的问题与Bamar的建议相同,即输出显示为BLOB。你有没有想过为什么会这样?团队名称数据类型是一个varchar50,我已经尝试将其转换为char,但没有骰子。因此,看起来我能够通过将变量转换为CHAR50来解决BLOB问题,这非常有效。谢谢你,朋友!
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`;