0

我正在尝试创建一个查询,该查询将从声明的变量中选择一个团队,然后通过为其余团队提供通用品牌和顺序 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 行,则应仅显示为 Team - 1 而不是 Team - 1-50),以便我的分组将好好工作。

谢谢您的帮助。

4

2 回答 2

0

使用您递增的用户定义变量。此外,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;

演示

于 2015-05-19T21:30:07.263 回答
0

这应该有效。内部查询通过仅在名称更改时递增计数器来为团队名称命名。外层使用这些名称进行分组。

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`;
于 2015-05-19T22:21:04.243 回答