【问题标题】:Compare 2 columns and count how many times the team won in ORACLE SQL比较 2 列并计算团队在 ORACLE SQL 中获胜的次数
【发布时间】:2020-08-22 14:14:23
【问题描述】:

我有一个这样的表,它已经加入了一些表。这是关于篮球比赛的。我想得到一个结果,显示球队名称和比赛次数,以及球队赢了和输了多少场比赛。

游戏桌:

game_id - NUMBER<br>
game_date - DATE<br>
location - VARCHAR2<br>
home_teamName - VARCHAR2<br>
away_teamName - VARCHAR2<br>
home_point - NUMBER<br>
away_point - NUMBER<br>

期望的结果:

team_name - VARCHAR2<br>
games - NUMBER<br>
win - NUMBER<br>
lose - NUMBER<br>

像这样:

名称|游戏|赢|输
AAA | 10   | 8 |2
BBB|| 9     | 4 |4
CCC|| 10   | 6 |5

目前,我使用下面的代码设法获取了每个团队的游戏数量,但我不知道如何获取其他团队。我也想知道是否可以在不加入表格的情况下获得所有内容。

SELECT T1.NAME, COUNT(T1.NAME) "GAME"
FROM SEE_GAME G
JOIN TEAM T1 ON G.HOME = T1.NAME
RIGHT JOIN TEAM T2 ON G.AWAY = T2.NAME
WHERE "HOME POINT" IS NOT NULL
GROUP BY T1.NAME;

以上代码的结果:
名称|游戏
AAA | 10
血脑屏障 | 9
CCC | 10
DDD | 10

团队表:
team_id - NUMBER
名称 - VARCHAR2
位置 - VARCHAR2

【问题讨论】:

    标签: sql oracle if-statement case


    【解决方案1】:

    您可以使用UNIONconditional aggregate,如下所示:

    SELECT TEAMNAME, 
           SUM(CASE WHEN WON = 'WON' THEN 1 ELSE 0 END) WON, 
           SUM(CASE WHEN WON = 'LOST' THEN 1 ELSE 0 END) LOST 
     FROM
      (SELECT G.HOME_TEAMNAME AS TEAMNAME, 
              CASE WHEN G.HOME_POINT > G.AWAY_POINT THEN 'WON' ELSE 'LOST' END AS WON -- THIS IS WINNING CONDITION
         FROM SEE_GAME G
       UNION ALL
       SELECT G.AWAY_TEAMNAME AS TEAMNAME, 
              CASE WHEN G.AWAY_POINT > G.HOME_POINT THEN 'WON'  ELSE 'LOST' END AS WON -- THIS IS WINNING CONDITION
        FROM SEE_GAME G)
    GROUP BY TEAMNAME;
    

    【讨论】:

      【解决方案2】:

      我建议对游戏进行“反透视”,然后进行聚合:

      select teamname, count(*), sum(is_win), sum(is_loss)
      from ((select home_teamname as teamname,
                    (case when home_point > away_point then 1 else 0 end) as is_win,
                    (case when home_point < away_point then 1 else 0 end) as is_loss
             from games g
            ) union all
            (select away_teamname,
                    (case when home_point < away_point then 1 else 0 end) as is_win,
                    (case when home_point > away_point then 1 else 0 end) as is_loss
             from games g
            )
           ) g
      group by teamname;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 2017-10-09
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 2016-10-02
        相关资源
        最近更新 更多