我有三张桌子:
team(ID, name)
goal(ID, team_ID, goalType_ID, date)
goalType(ID, name)
可以看到,team_ID是teams表的ID,goalType_ID是goalType表的ID。
对于所有球队,我想列出曾经发生过的不同类型进球的数量,如果没有则应该出现 0。
我们不需要关心目标表,因为我们不需要目标类型的名称,所以我得到了以下仅使用前两个表的代码:
SELECT team.ID, team.name, goal.goaType_ID
FROM team LEFT JOIN goal ON team.ID=goal.team_ID
这会产生一个我想要的三列信息表,但我想计算 DISTINCT goalTypes 和 GROUP BY team.ID 或 team.name 的数量,并保留三列,如果结果为 null ,显示 0(球队可能没有进球)。
生成的表格看起来像这样:
team.ID team.name goalsType.ID
1 Team_1 1
2 Team_2 2
2 Team_2 2
2 Team_2 2
3 Team_3 4
4 Team_4 null
5 Team_5 null
6 Team_6 1
6 Team_6 2
6 Team_6 4
6 Team_6 3
7 Team_7 5
7 Team_7 4
8 Team_8 null
我尝试过GROUP BY、DISTINCT和COUNT的组合,但仍然得不到我想要的结果。
我的做法是错的吗?
根据戈登·利诺夫的回答,我尝试这样做:
SELECT DISTINCT team.name, COUNT(goal.goalType_ID)
FROM team LEFT JOIN goal ON team.ID=goal.team_ID
GROUP BY team.ID, team.name
它会给我:
Name #0
Team_1 1
Team_2 3
Team_3 1
Team_4 0
Team_5 0
Team_6 4
Team_7 1
Team_8 0
如果我尝试使用“DISTINCT team.ID,DISTINCT team.name”,则会出错。
这是你想要的吗?
SELECT team.ID, team.name, count(distinct goal.goalType_ID) as NumGoalTypes
FROM team LEFT JOIN
goal
ON team.ID = goal.team_ID
GROUP BY team.ID, team.name;
试试这个http://sqlfiddle.com/#!3/8ec680/13
;WITH cte
AS (SELECT Row_number() OVER(partition BY tname
ORDER BY goalid), * from temp)--temp= Your join statement
SELECT CASE
WHEN a.goalid IS NULL THEN 0
ELSE a.row_n
END [count],
a.tid,
a.tname,
a.goalid
FROM cte a
JOIN (SELECT Max(row_n) row_n,
tname
FROM cte
GROUP BY tname) b
ON a.row_n = b.row_n
AND a.tname = b.tname