I have SQL data that looks like the following:
ResultId HomeTeam HomeScore AwayTeam AwayScore
1045 USA 2 France 3
1046 USA 1 Botswana 1
1047 Botswana 2 France 2
How can I recurse through this data to get total wins, draws, losses by team for both home and away? My output would look something like:
Team Wins Draws Losses
USA 0 1 1
France 1 1 0
Botswana 0 2 0
I was able to get this done in a very linear way by simply get a list of distinct teams and for each team looping through the data and tallying the win, draw, loss total and aggregating that into variables. However, I imagine there may be a different way to accomplish this.
CodePudding user response:
You don't need recursion here, you can just unpivot the Home and Away sides, then group by the Team and do conditional aggregation
SELECT
v.Team,
Wins = COUNT(CASE WHEN ScoreDiff > 0 THEN 1 END),
Draws = COUNT(CASE WHEN ScoreDiff = 0 THEN 1 END),
Losses = COUNT(CASE WHEN ScoreDiff < 0 THEN 1 END)
FROM Matches
CROSS APPLY (VALUES
(HomeTeam, HomeScore - AwayScore),
(AwayTeam, AwayScore - HomeScore)
) v(Team, ScoreDiff)
GROUP BY
v.Team;
| Team | Wins | Draws | Losses |
|---|---|---|---|
| Botswana | 0 | 1 | 0 |
| DRC | 0 | 1 | 0 |
| France | 1 | 1 | 0 |
| USA | 0 | 1 | 1 |
CodePudding user response:
There is a more straightforward solution by combining outputs of two queries using Union All, where the first query processes the results of matches for "HomeTeam", and the second for "AwayTeam".
Select Team, Sum(Wins), Sum(Draws), Sum(Losses)
From (
Select HomeTeam As Team,
Sum(Iif(HomeScore>AwayScore, 1, 0)) As Wins,
Sum(Iif(HomeScore=AwayScore, 1, 0)) As Draws,
Sum(Iif(HomeScore<AwayScore, 1, 0)) As Losses
From Tbl
Group by HomeTeam
Union All
Select AwayTeam As Team,
Sum(Iif(AwayScore>HomeScore, 1, 0)) As Wins,
Sum(Iif(AwayScore=HomeScore, 1, 0)) As Draws,
Sum(Iif(AwayScore<HomeScore, 1, 0)) As Losses
From Tbl
Group by AwayTeam) As T
Group By Team
Order by Team
