【问题标题】:Counting a value's matches in 2 columns, counting separately计算 2 列中的值匹配,分别计算
【发布时间】:2018-04-28 20:10:46
【问题描述】:

我有一个这样的表(称为结果),其中包含锦标赛的分数:

id | Winner | Loser | Score
---+--------+-------+------
1    Bob      Joe     4
2    Roy      Mary    3
3    Joe      Roy     6
4    Mary     Bob     1
5    Ellen    Roy     9
6    José     Roy     2
7    Joe      Bob     7

我要做的是计算每个名字获胜的次数,每次失败的次数,并按游戏次数降序排列:

Name | Wins | Losses | NumberGames
-----+------+--------+------------
Roy    1     3         4
Bob    1     2         3
Joe    2     1         3
Mary   1     1         2
Ellen  1     0         1
José   1     0         1

更好的是,我想按赢得比赛的百分比除以所玩的总比赛(赢加输)来降序排列。

我不想硬编码任何名称,例如获胜者 = “鲍勃”。

我知道如何制定一个查询来计算每个单独的列,但我还没有弄清楚如何创建 3 个不同的计数并按名称进行分组。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    我想做的是统计每个名字出现的次数 赢家,每次他们都是输家,然后按降序排列 玩过的游戏数:

    此查询的工作原理是根据查询的获胜者和失败者列生成唯一的名称列表。

    查询

    SELECT
     DISTINCT
      Results.Winner AS name
     FROM 
      Results
    
    UNION 
    
    SELECT
     DISTINCT
      Results.Loser AS name
     FROM 
      Results 
    

    然后 LEFT JOIN 与获胜者和失败者 COUNT 的唯一名单来获得胜利和失败。

    查询

    SELECT
       Results_Wins_Losses.name
     , Results_Wins_Losses.Wins 
     , Results_Wins_Losses.Losses 
     , (Results_Wins_Losses.Wins + Results_Wins_Losses.Losses) AS NumberGames
    FROM ( 
    
      SELECT 
         unique_result_names.name
       , (
          CASE
             WHEN results_wins.Wins IS NULL
             THEN 0
             ELSE results_wins.Wins
           END
          ) AS Wins 
       , (
          CASE
             WHEN results_losses.Losses IS NULL
             THEN 0
             ELSE results_losses.Losses
           END
          ) AS Losses   
      FROM ( 
        SELECT
         DISTINCT
          Results.Winner AS name
         FROM 
          Results
    
        UNION 
    
        SELECT
         DISTINCT
          Results.Loser AS name
         FROM 
          Results 
    
      ) AS unique_result_names
    
      LEFT JOIN (
        SELECT
           Results.Winner
         , COUNT(*) AS Wins
        FROM  
         Results
        GROUP BY
         Results.Winner
      ) AS results_wins 
      ON
       unique_result_names.name = results_wins.Winner
    
      LEFT JOIN (
        SELECT
           Results.Loser
         , COUNT(*) AS Losses
        FROM  
         Results
        GROUP BY
         Results.Loser
      ) AS results_losses
      ON
       unique_result_names.name = results_losses.Loser
    ) AS Results_Wins_Losses
    ORDER BY 
     NumberGames DESC
    

    结果

    |  name | Wins | Losses | NumberGames |
    |-------|------|--------|-------------|
    |   Roy |    1 |      3 |           4 |
    |   Bob |    1 |      2 |           3 |
    |   Joe |    2 |      1 |           3 |
    |  Mary |    1 |      1 |           2 |
    | Ellen |    1 |      0 |           1 |
    |  José |    1 |      0 |           1 |
    

    查看演示http://sqlfiddle.com/#!9/68abe/33

    【讨论】:

      【解决方案2】:

      另一种方法:

      SELECT  Name,
              SUM(Wins) AS Wins,
              SUM(Losses) AS Losses,
              SUM(Wins) + SUM(Losses) AS NumberGames
          FROM  
            (
              SELECT  winner AS Name, COUNT(*) AS Wins, 0 AS Losses
                  FROM  Results
                  GROUP BY  winner
              UNION  ALL 
              SELECT  loser AS Name,  0 AS Wins, COUNT(*) AS Losses
                  FROM  Results
                  GROUP BY  loser 
            )
          ORDER BY 4 DESC
      

      【讨论】:

        猜你喜欢
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多