SQL新手面临空行挑战

时间:2014-04-08 00:35:09

标签: sql

我可能也有一些设计问题,但如果有可能做我现在所做的设计,我宁愿这样做,然后继续学习和优化。

我有一个gameresults表,每个游戏有两行(一个用于家庭,一个用于离开)。 也就是说,有一个带有teamid 1的行gameid 1(目标,积分等)然后另一行gameid 1有一个teamid 2的条目(目标,积分等)。 Gamesresults还有联盟ID(了解游戏所属的联赛)和categoryid(一个联盟可以有几个类别)。

我对游戏结果的PK是gameid + teamid。

我认为,由于我不仅仅是在查看排名而不是输入游戏数据,因此我可以复制一些字段,以便更简单的查询来构建排名。

我还有一个团队表,其中我有团队ID,名称等团队,并且还包含一个categoryid来描述团队所属的类别。

我的目标是能够为每个团队检索目标,积分,比赛等的汇总数据并包含团队名称。

另外,如果联盟中的球队已经没有在比赛中打过任何比赛,我希望能够列出所有0的值。

我尝试过不同的查询和左/右连接组合等。

我想出的最好的是:

SELECT 
teams.TeamID,
teams.TeamName,
SUM(PointsAwarded) as PTS,
SUM(TotalGF) as GF,
SUM(TotalGA) as GA,
COUNT(IDGame) as GP,
SUM(CASE WHEN PointsAwarded=2 THEN 1 ELSE 0 END) as W, 
SUM(CASE WHEN PointsAwarded=1 THEN 1 ELSE 0 END) as O, 
SUM(CASE WHEN PointsAwarded=0 THEN 1 ELSE 0 END) as L
from Teams
left join gamesresults on teams.TeamID = gamesresults.idteam
where Teams.TeamcategoryID=1 and gameresults.idleague=1
group by  teams.TeamID, teams.TeamName
order by pts desc

这给了我所有球队,除了那些没有参加比赛的球队。

如果我这样做(我从where子句中删除了联盟):

SELECT 
teams.TeamID,
teams.TeamName,
SUM(PointsAwarded) as PTS,
SUM(TotalGF) as GF,
SUM(TotalGA) as GA,
COUNT(IDGame) as GP,
SUM(CASE WHEN PointsAwarded=2 THEN 1 ELSE 0 END) as W, 
SUM(CASE WHEN PointsAwarded=1 THEN 1 ELSE 0 END) as O, 
SUM(CASE WHEN PointsAwarded=0 THEN 1 ELSE 0 END) as L
from Teams
left join gamesresults on teams.TeamID = gamesresults.idteam
where Teams.TeamcategoryID=1
group by  teams.TeamID, teams.TeamName
order by pts desc

当然给了我所有的球队(包括那些还没有参加过比赛的球队),但它会计算每个联赛中的比赛。

关于如何解决这个问题的任何想法?

谢谢!

塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要将条件移动到ON子句以保留外连接:

left join gamesresults 
on teams.TeamID = gamesresults.idteam 
and gameresults.idleague=1;