当sum为0

时间:2017-05-05 14:50:09

标签: sql

我正试图从这里解决问题13:http://sqlzoo.net/wiki/The_JOIN_operation在其中我应该“列出每场比赛的每场比赛,如图所示”。我认为这就是答案:

SELECT 
    mdate, team1,
    SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) score1,
    team2,
    SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END) score2
FROM 
    game 
JOIN 
    goal ON matchid = id
GROUP BY 
    team1, team2, mdate
ORDER BY 
    mdate

但是,如果两个团队得分为0,则此查询不返回任何行。我尝试将SUM包裹在ISNULLCOALESCE中,但它没有帮助。

说实话我真的不是在寻找如何解决问题的答案,而是解释为什么当得分为0:0时这个查询没有向我显示行的答案。此外,如果有人可以帮助我找到0 column_name1 column_name背后的含义(因为它似乎是上面CASE的结果),它似乎是0 * column_name或1 * column_name,但我不确定,当我试图寻找答案时谷歌充满了无关的结果。

PS:是的,我确实阅读了前20个建议的堆栈溢出问题,这些问题具有相同或相似的名称,如果它是重复的话我很抱歉

1 个答案:

答案 0 :(得分:2)

你没有得到0-0游戏的任何结果,因为join运算符只返回两个表中匹配的那些行。另一种说法是,您只会获得在ON子句中指定的ID(在您的情况下为匹配ID)在两个表中都可用的行。

<0> 0-0的游戏在goal表格中没有任何记录,这就是为什么你使用的inner join没有返回任何内容的原因。

您需要使用left join,以便保留左表(game的所有行),即使他们在右表中没有匹配的行(goal)。

SELECT  t1.mdate,
        t1.team1,
        SUM(CASE WHEN t2.teamid = t1.team1 THEN 1 ELSE 0 END) score1,
        t1.team2,
        SUM(CASE WHEN t2.teamid = t1.team2 THEN 1 ELSE 0 END) score2
FROM    game t1
LEFT JOIN 
        goal t2
ON      t2.matchid = t1.id
GROUP BY t1.team1, t1.team2, t1.mdate

我还建议您为表使用别名并将它们作为列名称的前缀,以避免混淆哪个字段属于哪个表。