Сравните 2 столбца и посчитайте, сколько раз команда выиграла в ORACLE SQL - PullRequest
0 голосов
/ 07 мая 2020

У меня есть такая таблица, которая уже объединила несколько таблиц. Это про баскетбол. Я хочу получить результат, который показывает название команды и количество игр, а также количество игр, которые команда выиграла и проиграла.

ИГРОВАЯ таблица:

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;

результат из приведенного выше кода:
name | GAME
AAA | 10
BBB | 9
CCC | 10
DDD | 10

Таблица КОМАНДЫ:
team_id - НОМЕР
имя - VARCHAR2
расположение - VARCHAR2

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Я бы посоветовал «отключить» игры, а затем объединить их:

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;
0 голосов
/ 07 мая 2020

Вы можете использовать UNION и conditional 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;
...