在 SQL Server 中使用 SUM 时遇到问题



我有三个表Match_EventTeam_DetailMatch_Schedule

Match_ScheduleMatchIdHometeam_IdAway TeamId列:

matchId  HTeam  Ateam
----------------------
  123     -1      -7 
  231     -3      -5

Match_event有与该比赛有关的事情。(监狱、犯规等)

matchId    TeamId    Score
--------------------------------
  123         1         1    
  123         1         1  
  123         7         1    
  231         5         1

最后一张表(TeamDetail

 TeamId    TeamName
   123     USA
   231     Uk

我试过这个

SELECT      
    Team_Detail.Team_Name,  
    SUM(CASE WHEN Team_Detail.Serno = Match_Events.Team_Id THEN 1 ELSE 0 END) AS HomeTeamScore, 
    Team_Detail.Team_Name, 
    SUM(CASE WHEN Team_Detail.Serno = Match_Events.Team_Id THEN 1 ELSE 0 END) AS AwayTeamScore              
FROM         
    Match_Schedule  
INNER JOIN 
    Match_Events ON Match_Schedule.Match_Serno = Match_Events.Match_ID   
INNER JOIN
    Team_Detail ON Match_Events.Team_Id = Team_Detail.Serno 
GROUP BY 
    Team_Name, Team_Name

我得到了正确的结果,但一个高于另一个,而不是在同一行中。

有人可以帮帮我吗?

谢谢

这里缺少一些信息 - 我在您的查询中看到您引用了名为 Serno 的列,但它们未在上面的表定义中指定。

看起来

好像您在示例数据中混合了 matchID 和 TeamID(我看到 ID 为 123 和 231 的比赛和球队)。

我想你可能想加入两次Team_Detail桌。一次,表被别名为主队(或类似的东西),并且只为主队加入Match_Schedule。

然后客队也是如此。

像这样:

SELECT  HomeTeam.Team_Name AS HomeTeamName, AwayTeam.Team_Name AS AwayTeamName, 
        SUM(CASE WHEN HomeTeam.TeamID = Match_Events.TeamId THEN Score ELSE 0 END) AS HomeTeamScore,
        SUM(CASE WHEN AwayTeam.TeamID = Match_Events.TeamId THEN Score ELSE 0 END) AS AwayTeamScore
FROM    Match_Schedule
JOIN    Match_Events ON Match_Events.MatchID = Match_Schedule.MatchID
JOIN    Team_Detail AS HomeTeam ON HomeTeam.TeamID = Match_Schedule.HTeam
JOIN    Team_Detail AS AwayTeam ON AwayTeam.TeamID = Match_Schedule.ATeam
GROUP BY HomeTeam.Team_Name, AwayTeam.Team_Name  

另外,我认为您希望根据分数进行求和,而不是硬编码的 1 值......除非一支球队的分数总是1(也许表示胜利)。

如果您希望有关单个匹配的信息位于单行上,则应按MatchId聚合。 然后使用条件聚合来获取要查找的信息。

SELECT max(case when ms.hteam = td.TeamId then Team_Detail.Team_Name end) as hometeam,  
       SUM(CASE WHEN ms.hteam = td.TeamId THEN me.score ELSE 0 END) AS HomeTeamScore, 
       max(case when ms.ateam = td.TeamId then Team_Detail.Team_Name end) as awayteam, 
       SUM(CASE WHEN ms.hteam = td.TeamId THEN me.score ELSE 0 END) AS AwayTeamScore              
FROM Match_Schedule ms INNER JOIN 
     Match_Events me
     ON ms.matchId = me.matchID INNER JOIN
     Team_Detail td
     ON me.teamId = td.teamId 
GROUP BY ms.matchid;

请注意其他一些事项。 我将查询更改为根据问题中的描述而不是查询中的示例使用字段。 我还更新了计算以使用score字段,而不仅仅是计算1

最新更新