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更容易、更清晰。虽然这不是偶然的错误。