1
votes

Sortie des équipes avec plus de la moitié des victoires (Exemple: 3/5)

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 commentaires

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!


3 Réponses :


0
votes

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


2 commentaires

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.



1
votes

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


0 commentaires

0
votes

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


0 commentaires