#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
Ответ №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