Выход команд с более чем половиной побед (пример: 3/5) - PullRequest
1 голос
/ 30 сентября 2019

У меня есть таблица (Встречи), которая содержит следующие столбцы:

HomeTeam(varchar)
AwayTeam(varchar)
Home(int)
Away(int)

Моя проблема заключается в том, что мне нужно вывести все команды, у которых более половины побед.

приведенный ниже код отлично работает для вывода, но мне нужно отфильтровать команды с более чем половиной побед. Например: «Ливерпуль» выиграл 3 из 5 игр, поэтому я хочу, чтобы его выиграли, у «ПСЖ» 4 из 5 побед, поэтому я хочу, чтобы они также были выиграны. Но у Man United есть только 2 победы из 5 игр, и я не хочу, чтобы они выходили.

Я использую MSSQL Server 18.

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

Ожидаемый результат:

Из Ювентуса 2/5,
МЮ, 1/5, ПСЖ 4/5,
Ливерпуль 3/5, Барселона 3/5,
Бавария Мюнхен 0/5,

Я хочу, чтобы на выходе были только «ПСЖ», «Ливерпуль» и «Барселона», поскольку у них больше половины побед.

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Вот ваше решение в «одном» выражении, логически разделенном в утверждении WITH:

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

Вывод:

TeamName    Wins    Games
A           2       1
C           1       0
D           2       3
0 голосов
/ 30 сентября 2019

Добавление ответа с помощью cte для организации таблицы победителей и проигравших

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 голосов
/ 30 сентября 2019

Вы можете LEFT JOIN дважды Teams с помощью Meetings (один раз для домашних игр и один раз для выездных игр), а затем проанализировать и отфильтровать вывод:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...