J'ai un tableau (Réunions) qui contient les colonnes suivantes:
SELECT T.*,
(SELECT COUNT(*)
FROM Meetings AS M
WHERE (M.HomeTeam = T.Team and M.Home > M.Away) OR
(M.AwayTeam = T.Team and M.Away > M.Home)
GROUP BY COUNT(*) > 2
) AS Wins
FROM Teams AS T
Mon problème est que j'ai besoin de sortir toutes les équipes qui ont plus de la moitié des victoires.
Le code fourni ci-dessous fonctionne parfaitement pour la sortie, mais je dois filtrer les équipes avec plus de la moitié des victoires. Par exemple: Liverpool a remporté 3 matchs sur 5, donc je veux qu'il soit sorti, le PSG a 4 victoires sur 5, donc je veux qu'ils soient également sortis. Mais Man United n'a que 2 victoires sur 5 jeux et je ne les veux pas dans la sortie.
J'utilise MSSQL Server 18.
HomeTeam(varchar) AwayTeam(varchar) Home(int) Away(int)
Le résultat attendu est:
De la Juventus 2/5,
Man United 1/5, PSG 4/5,
Liverpool 3/5, Barcelone 3/5,
Bayern Munich 0/5,
Je veux que la sortie ne soit que le PSG, Liverpool et Barcelone car ils ont plus d'une demi-victoire.
3 Réponses :
Vous pouvez LEFT JOIN deux fois Teams avec Meetings (une fois pour les matchs à domicile et une fois pour les matchs à l'extérieur), puis analyser et filtrer les sortie:
SELECT
t.*,
COALESCE(h.cnt_wins, 0) + COALESCE(a.cnt_wins, 0) total_wins,
COALESCE(h.cnt_games, 0) + COALESCE(a.cnt_games, 0) total_games
FROM Teams t
LEFT JOIN (
SELECT
HomeTeam Team,
SUM(CASE WHEN Home > Away THEN 1 ELSE 0 END) cnt_wins,
COUNT(*) cnt_games,
FROM Meetings
GROUP BY HomeTeam
) h ON m.Team = t.Team
LEFT JOIN (
SELECT
AwayTeam Team,
SUM(CASE WHEN Home < Away THEN 1 ELSE 0 END) cnt_wins,
COUNT(*) cnt_games,
FROM Meetings
GROUP BY AwayTeam
) a ON a.Team = t.Team
WHERE
COALESCE(h.cnt_wins, 0) + COALESCE(a.cnt_wins, 0)
> ( COALESCE(h.cnt_games, 0) + COALESCE(a.cnt_games, 0) ) / 2
Bienvenue @ S1C4R10! Heureux d'aider.
Pour seulement deux paramètres, il est plus facile et plus clair d'utiliser IsNull () que COALESCE (). Bien que ce ne soit pas une erreur par hasard.
Voici votre solution en "une" instruction, divisée logiquement en instruction WITH:
TeamName Wins Games A 2 1 C 1 0 D 2 3
Sortie:
DECLARE @Meetings TABLE (
HomeTeam VARCHAR(100) NOT NULL,
AwayTeam VARCHAR(100) NOT NULL,
Home INT NOT NULL,
Away INT NOT NULL
)
INSERT INTO @Meetings
(
HomeTeam,
AwayTeam,
Home,
Away
)
VALUES
('A', 'B', 2, 5),
('C', 'D', 1, 5),
('A', 'D', 3, 2),
('C', 'A', 1, 5),
('C', 'B', 4, 2),
('B', 'D', 1, 4)
;WITH Teams AS (
SELECT DISTINCT HomeTeam AS TeamName FROM @Meetings
UNION
SELECT DISTINCT AwayTeam FROM @Meetings
)
, TeamWins AS (
SELECT T.TeamName, (HW.HomeWins + AW.AwayWins) Wins, GM.Games FROM Teams T
OUTER APPLY
(SELECT COUNT(*) HomeWins FROM @Meetings M WHERE M.HomeTeam = T.TeamName AND M.Home > M.Away) HW
OUTER APPLY
(SELECT COUNT(*) AwayWins FROM @Meetings M WHERE M.AwayTeam = T.TeamName AND M.Away > M.Home) AW
OUTER APPLY
(SELECT COUNT(*) Games FROM @Meetings M WHERE M.AwayTeam = T.TeamName) GM
)
SELECT * FROM TeamWins TW WHERE 2*TW.Wins > TW.Games
Ajout d'une réponse en utilisant un cte pour organiser le tableau en gagnants et perdants
declare @t table (HomeTeam varchar(100),AwayTeam varchar(100),Home int, Away int)
-- determine winner and loser
;with cte as
(
select Outcome,Team
from @t
cross apply (values
('W'
, case when Home>Away
then HomeTeam
else AwayTeam end)
,('L', case when Home>Away
then AwayTeam
else HomeTeam end)) ca(Outcome,Team)
where Home<>Away
)
select Team
,wins = SUM(case when Outcome = 'W' then 1 else 0 end )
,Losses = SUM(case when Outcome = 'L' then 1 else 0 end )
,Rate = SUM(case when Outcome = 'W' then 1 else 0 end )/COUNT(*)
from cte
group by Team
having SUM(case when Outcome = 'W' then 1 else 0 end )/COUNT(*)>.5
Typo ..
(M.AwayTeam = T.Team et M.Away> M.Away)doit être(M.AwayTeam = T.Team et M.Away> M.Home) < / code> M.Away ne sera jamais plus grand que lui-même.Comment allez-vous gérer les cravates?
Je n'ai besoin que des victoires, les cravates n'ont pas d'importance!