我的 CASE 语句查询有什么问题

问题描述 投票:0回答:8

我正在尝试解决 http://www.sqlzoo.net/wiki/The_JOIN_operation

上的#13

“列出每场比赛以及每支球队的进球数,如图所示。这将使用“CASE WHEN”,这在之前的练习中尚未解释过。”

这是我的疑问:

SELECT game.mdate, game.team1, 
SUM(CASE WHEN goal.teamid = game.team1 THEN 1 ELSE 0 END) AS score1,
game.team2,
SUM(CASE WHEN goal.teamid = game.team2 THEN 1 ELSE 0 END) AS score2

FROM game INNER JOIN goal ON matchid = id
GROUP BY game.id
ORDER BY mdate,matchid,team1,team2

我得到的结果是“行数太少”。我不明白我哪里错了。

mysql sql select group-by case
8个回答
29
投票

INNER JOIN
仅返回有进球的比赛,即
goal
game
表之间的比赛。

您需要的是

LEFT JOIN
。您需要第一个表中的所有行,
game
,但它们不需要匹配
goal
中的所有行,根据我对您的问题所做的 0-0 评论:

SELECT game.mdate, game.team1, 
SUM(CASE WHEN goal.teamid = game.team1 THEN 1 ELSE 0 END) AS score1,
game.team2,
SUM(CASE WHEN goal.teamid = game.team2 THEN 1 ELSE 0 END) AS score2

FROM game LEFT JOIN goal ON matchid = id
GROUP BY game.id,game.mdate, game.team1, game.team2 
ORDER BY mdate,matchid,team1,team2

这将返回 6 月 27 日葡萄牙和西班牙之间 0-0 的结果,您最初的答案错过了。


3
投票

由于两个表中存在同名列,因此无需指定当前列来自何处。

SELECT mdate, team1, 

SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) AS score1,

team2,

SUM(CASE WHEN teamid = team2 THEN 1 ELSE 0 END) AS score2

FROM game LEFT JOIN goal ON matchid = id

GROUP BY mdate, team1, team2

ORDER BY mdate,matchid,team1,team2

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

1
投票

我使用子查询做到了。

这里唯一的技巧是要明白,我们需要使用左连接而不是内连接,因为如果我们使用内连接(0-0 情况),有些比赛的进球数为 0,而这些游戏不会在我们的查询中捕获

希望以下查询有帮助!

select t1.mdate,t1.team1,sum(t1.score1),t1.team2,sum(t1.score2) from(
SELECT mdate,
  team1,
  CASE WHEN teamid=team1 THEN 1 ELSE 0 END score1,
  team2,
  CASE WHEN teamid=team2 THEN 1 ELSE 0 END score2
  FROM game JOIN goal ON matchid = id)t1
group by t1.mdate,t1.team1,t1.team2
order by mdate,team1,team2

0
投票

对于 MySQL,@mjsqu 的答案有效,但是

for SQL Server
和其他一些方言,您需要在
specify all the columns
GROUP BY
。因此,如果您熟悉 MySQL,请记住,在某些方言中,您必须在 GROUP BY 中更加具体(不幸的是......)。在适用于 SQL Server 的脚本下面:

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

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

0
投票

如果您在 SQLZOO 工作 选择日期, 团队1, sum(CASE WHEN teamid=team1 THEN 1 ELSE 0 END) Score1,team2, sum(CASE WHEN teamid=team2 then '1' else'0' end) Score2 FROM 游戏 JOIN 目标 ON matchid = id 按 id 分组 按 mdate、matchid、team1、team2 排序


-1
投票

`

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

`

© www.soinside.com 2019 - 2024. All rights reserved.