Sql server 获胜超过一半的团队的输出(示例:3/5)

Sql server 获胜超过一半的团队的输出(示例:3/5),sql-server,Sql Server,我有一个包含以下列的会议表: HomeTeam(varchar) AwayTeam(varchar) Home(int) Away(int) 我的问题是,我需要输出所有获胜超过一半的球队 下面提供的代码对于输出非常有效,但是我需要过滤出获胜超过一半的团队。例如: 利物浦已经赢了5场比赛中的3场,所以我希望这场比赛能被淘汰出局,巴黎圣日耳曼体育俱乐部5场比赛中有4场获胜,所以我希望他们也能被淘汰出局。但是曼联在5场比赛中只赢了2场,我不希望他们出现在比赛结果中 我使用的是MSSQL服务器18 S

我有一个包含以下列的会议表:

HomeTeam(varchar)
AwayTeam(varchar)
Home(int)
Away(int)
我的问题是,我需要输出所有获胜超过一半的球队

下面提供的代码对于输出非常有效,但是我需要过滤出获胜超过一半的团队。例如: 利物浦已经赢了5场比赛中的3场,所以我希望这场比赛能被淘汰出局,巴黎圣日耳曼体育俱乐部5场比赛中有4场获胜,所以我希望他们也能被淘汰出局。但是曼联在5场比赛中只赢了2场,我不希望他们出现在比赛结果中

我使用的是MSSQL服务器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, PSG 4/5, 利物浦3/5, 巴塞罗那3/5, 拜仁慕尼黑0/5

我希望输出中只有巴黎圣日耳曼、利物浦和巴塞罗那,因为他们赢得了超过一半的胜利。

你可以加入两支球队,一支参加主场比赛,一支参加客场比赛,然后分析和过滤输出:

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

这是一条语句中的解决方案,逻辑上分为以下语句:

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

使用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

打字错误M.AwayTeam=T.团队和M.AwayTeam>M.客场应该是M.AwayTeam=T.团队和M.awaye>M.主场M.客场永远不会比自己强大。你将如何处理平局?我只需要胜利,平局不重要!欢迎@S1C4R10!很乐意提供帮助。仅对于两个参数,使用IsNull比使用COALESCE更容易、更清晰。虽然这不是偶然的错误。