【问题标题】:MySQL Running Total on multiple columns grouped by another columnMySQL 在由另一列分组的多列上运行总计
【发布时间】:2020-10-17 20:22:27
【问题描述】:

我正在尝试根据另一列的分组在多列上创建运行总计。

Running total with in each group using MySQL 此处答案中的方法开始,我可以将其用于总计一列,但之后的任何其他列都会计算运行总计 - 分组被忽略。

示例数据 - 游戏桌

|TeamID|GameID| w| l|
|------|------|--|--|
|     1|     1| 1| 0|
|     1|     2| 0| 1|
|     1|     3| 1| 0|
|     1|     9| 0| 1|
|     1|    10| 1| 0|
|     2|     4| 1| 0|
|     2|     5| 1| 0|
|     2|     6| 1| 0|
|     2|     7| 0| 1|
|     2|     8| 0| 1|
|     3|     1| 0| 1|
|     3|     2| 1| 0|
|     3|     3| 0| 1|
|     3|     7| 1| 0|
|     3|     8| 1| 0|
|     4|     4| 0| 1|
|     4|     5| 0| 1|
|     4|     6| 0| 1|
|     4|     9| 1| 0|
|     4|    10| 0| 1|

期望的结果 - 累积的 w 和 l,按 TeamID 分组

|TeamID|GameID| w| l|cum_w|cum_l|   Pct|
|------|------|--|--|-----|-----|------|
|     1|     1| 1| 0|    1|    0| 1.000|
|     1|     2| 0| 1|    1|    1|  .500|
|     1|     3| 1| 0|    2|    1|  .667|
|     1|     9| 0| 1|    2|    2|  .500|
|     1|    10| 1| 0|    3|    2|  .600|
|     2|     4| 1| 0|    1|    0| 1.000|
|     2|     5| 1| 0|    2|    0| 1.000|
|     2|     6| 1| 0|    3|    0| 1.000|
|     2|     7| 0| 1|    3|    1|  .750|
|     2|     8| 0| 1|    3|    2|  .600|
|     3|     1| 0| 1|    0|    1|  .000|
|     3|     2| 1| 0|    1|    1|  .500|
|     3|     3| 0| 1|    1|    2|  .333|
|     3|     7| 1| 0|    2|    2|  .500|
|     3|     8| 1| 0|    3|    2|  .600|
|     4|     4| 0| 1|    0|    1|  .000|
|     4|     5| 0| 1|    0|    2|  .000|
|     4|     6| 0| 1|    0|    3|  .000|
|     4|     9| 1| 0|    1|    3|  .250|
|     4|    10| 0| 1|    1|    4|  .200|

我修改了上面链接中的代码并正在运行它...(我什至还没有尝试计算 Pct)

    select g.*,
       (@w := if(@TeamID = TeamID, @w + w, 
                 if(@TeamID := TeamID, w, w)
                )
       ) as cum_w, 
       (@l := if(@TeamID = TeamID, @l + l,
                 if(@TeamID := TeamID, l, l)
                )
       ) as cum_l        
from (select TeamID, GameID, w, l
      from games) g
cross join (select @TeamID := -1, @w := 0, @l := 0) params
order by TeamID, GameID;

我得到了什么。累积 w 有效,累积 l 是忽略 TeamID 的运行总计。如果我删除 cum_w,cum_l 有效。如果我在 select 语句中颠倒顺序,第一个有效,第二个无效

|TeamID|GameID| w| l|cum_w|cum_l|
|------|------|--|--|-----|-----|
|     1|     1| 1| 0|    1|    0|
|     1|     2| 0| 1|    1|    1|
|     1|     3| 1| 0|    2|    1|
|     1|     9| 0| 1|    2|    2|
|     1|    10| 1| 0|    3|    2|
|     2|     4| 1| 0|    1|    2|
|     2|     5| 1| 0|    2|    2|
|     2|     6| 1| 0|    3|    2|
|     2|     7| 0| 1|    3|    3|
|     2|     8| 0| 1|    3|    4|
|     3|     1| 0| 1|    0|    5|
|     3|     2| 1| 0|    1|    5|
|     3|     3| 0| 1|    1|    6|
|     3|     7| 1| 0|    2|    6|
|     3|     8| 1| 0|    3|    6|
|     4|     4| 0| 1|    0|    7|
|     4|     5| 0| 1|    0|    8|
|     4|     6| 0| 1|    0|    9|
|     4|     9| 1| 0|    1|    9|
|     4|    10| 0| 1|    1|   10|

最终,我将有另外两列,其中包含按 TeamID 分组的运行总数,以及在这 10 场比赛中运行 10 场比赛 w & l 和 pct。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的用户定义变量在第一列中被覆盖。为丢失添加第二个

    CREATE TABLE games (
      `TeamID` INTEGER,
      `GameID` INTEGER,
      `w` INTEGER,
      `l` INTEGER
    );
    
    INSERT INTO games
      (`TeamID`, `GameID`, `w`, `l`)
    VALUES
      ('1', '1', '1', '0'),
      ('1', '2', '0', '1'),
      ('1', '3', '1', '0'),
      ('1', '9', '0', '1'),
      ('1', '10', '1', '0'),
      ('2', '4', '1', '0'),
      ('2', '5', '1', '0'),
      ('2', '6', '1', '0'),
      ('2', '7', '0', '1'),
      ('2', '8', '0', '1'),
      ('3', '1', '0', '1'),
      ('3', '2', '1', '0'),
      ('3', '3', '0', '1'),
      ('3', '7', '1', '0'),
      ('3', '8', '1', '0'),
      ('4', '4', '0', '1'),
      ('4', '5', '0', '1'),
      ('4', '6', '0', '1'),
      ('4', '9', '1', '0'),
      ('4', '10', '0', '1');
    
        select g.*,
           (@w := if(@TeamID = TeamID, @w + w, 
                     if(@TeamID := TeamID, w,w)
                    )
           ) as cum_w, 
           (@l := if(@Team2ID = TeamID, @l + l,
                     if(@Team2ID := TeamID, l, l)
                    )
           ) as cum_l        
    from (select TeamID, GameID, w, l
          from games order by TeamID, GameID) g
    cross join (select @TeamID := -1, @Team2ID := -1, @w := 0, @l := 0) params
    ;
    
    团队ID |游戏ID | w | l |暨_w | cum_l -----: | -----: | -: | -: | ----: | ----: 1 | 1 | 1 | 0 | 1 | 0 1 | 2 | 0 | 1 | 1 | 1 1 | 3 | 1 | 0 | 2 | 1 1 | 9 | 0 | 1 | 2 | 2 1 | 10 | 1 | 0 | 3 | 2 2 | 4 | 1 | 0 | 1 | 0 2 | 5 | 1 | 0 | 2 | 0 2 | 6 | 1 | 0 | 3 | 0 2 | 7 | 0 | 1 | 3 | 1 2 | 8 | 0 | 1 | 3 | 2 3 | 1 | 0 | 1 | 0 | 1 3 | 2 | 1 | 0 | 1 | 1 3 | 3 | 0 | 1 | 1 | 2 3 | 7 | 1 | 0 | 2 | 2 3 | 8 | 1 | 0 | 3 | 2 4 | 4 | 0 | 1 | 0 | 1 4 | 5 | 0 | 1 | 0 | 2 4 | 6 | 0 | 1 | 0 | 3 4 | 9 | 1 | 0 | 1 | 3 4 | 10 | 0 | 1 | 1 | 4

    db小提琴here

    【讨论】:

    • 谢谢。那成功了。我知道这很简单,但不知怎的,昨晚我完全困惑了。
    猜你喜欢
    • 2016-02-21
    • 2012-06-27
    • 2016-11-07
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多