0

我有三张桌子Match_EventTeam_DetailMatch_Schedule

Match_ScheduleMatchId, Hometeam_Id, Away 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

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

有人可以帮帮我吗。

谢谢

4

2 回答 2

0

There is some missing information here- I see in your query you reference columns named Serno, but they are not specified in your table definitions above.

It also looks as if you are mixing up matchID and TeamID in your example data (I see matches and teams both with IDs of 123 and 231).

I think you probably want to join against the Team_Detail table twice. Once where the tables is aliased as HomeTeam (or something similar) and joins against Match_Schedule only for the home team.

Then the same thing for the away team.

Something like this:

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  

Also, I think yo uwant to SUM based on Score, rather than a hard coded 1 value.... Unless maybe a team's score is always 1 (indicating a win, perhaps).

于 2013-09-15T12:22:54.953 回答
0

如果您希望有关单个匹配项的信息位于单行上,则应按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

于 2013-09-15T12:39:02.757 回答