Sql для сложного запроса win

#sql

#sql

Вопрос:

У меня есть следующая таблица в виде записей

 TeamA   | TeamB      | Winner
-------- ------------ ---------
Lakers  | Sacramento | Lakers
Clipper | Rockets    | Rockets
Lakers  | Suns       | Suns
  

Необходимо преобразовать в таблицу следующим образом

 Team   | Win | Loss | TotalMatches
Lakers |  1  |   1  |     2
........
  

Я начал с объединения, но не смог продвинуться

 Select 
    TeamA, TeamB
from 
    Records
union
Select 
     teamA, teamB
  

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

Вы можете отключить первое использование bu UNION ALL , а затем применить условное агрегирование

 SELECT team, SUM(CASE WHEN winner = team THEN 1 ELSE 0 END) AS Win,
             SUM(CASE WHEN winner != team THEN 1 ELSE 0 END) AS Loss,
             COUNT(*) AS TotalMatches
  FROM ( SELECT teamA AS team, Winner FROM Records
         UNION ALL 
         SELECT teamB, Winner FROM Records ) r
 GROUP BY team
  

Demo

Ответ №2:

Используйте UNION ALL, чтобы получить 1 строку для каждой команды и сопоставить с результатом сопоставления и агрегирования:

 SELECT Team, 
       SUM(result) Win,
       SUM(1 - result) Loss,
       COUNT(*) TotalMatches
FROM (
  SELECT TeamA AS Team, CASE WHEN TeamA = Winner THEN 1 ELSE 0 END result
  FROM Records
  UNION ALL
  SELECT TeamB, CASE WHEN TeamB = Winner THEN 1 ELSE 0 END 
  FROM Records
) t
GROUP BY Team
  

Смотрите демонстрацию (для SQL Server, но это стандартный SQL).

 > Team       | Win | Loss | TotalMatches
> :--------- | --: | ---: | -----------:
> Clipper    |   0 |    1 |            1
> Lakers     |   1 |    1 |            2
> Rockets    |   1 |    0 |            1
> Sacramento |   0 |    1 |            1
> Suns       |   1 |    0 |            1