Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server中的SUM存在问题_Sql Server_Select_Sum - Fatal编程技术网

Sql server SQL Server中的SUM存在问题

Sql server SQL Server中的SUM存在问题,sql-server,select,sum,Sql Server,Select,Sum,我有三个表Match\u Event,Team\u Detail和Match\u Schedule Match\u计划有列MatchId,Hometeam\u Id,客场团队Id: matchId HTeam Ateam ---------------------- 123 -1 -7 231 -3 -5 Match_事件包含与该匹配相关的内容。(监禁、犯规等) 最后一个表(TeamDetail) 我试过这个 SELECT

我有三个表
Match\u Event
Team\u Detail
Match\u Schedule

Match\u计划
有列
MatchId
Hometeam\u Id
客场团队Id

matchId  HTeam  Ateam
----------------------
  123     -1      -7 
  231     -3      -5
Match_事件
包含与该匹配相关的内容。(监禁、犯规等)

最后一个表(
TeamDetail

我试过这个

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的比赛和球队)

我想你可能想两次加入球队细节表。一旦表格化名为HomeTeam(或类似名称),并且仅针对主队加入Match_时间表

客队也是如此

大概是这样的:

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;
注意其他一些事情。我将查询更改为使用基于问题中的描述的字段,而不是查询中的示例。我还更新了计算以使用
得分
字段,而不仅仅是计数
1

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  
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;