0

と の 3 つのテーブルMatch_EventTeam_DetailありMatch_Scheduleます。

Match_Scheduleは列MatchIdHometeam_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

ここにはいくつかの情報がありません。クエリでSernoという名前の列を参照していることがわかりますが、上記のテーブル定義では指定されていません。

また、例のデータで matchID と TeamID を混同しているようにも見えます (ID が 123 と 231 の一致とチームの両方が表示されます)。

おそらく、Team_Detail テーブルに対して 2 回参加する必要があると思います。テーブルが HomeTeam (または類似のもの) としてエイリアス化され、ホーム チームの 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 である場合を除きます (おそらく勝利を示します)。

于 2013-09-15T12:22:54.953 に答える
0

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

于 2013-09-15T12:39:02.757 に答える