如何在连接后列出不同的列并计数?
问题描述:
我有三个表:如何在连接后列出不同的列并计数?
team(ID, name)
goal(ID, team_ID, goalType_ID, date)
goalType(ID, name)
正如你所看到的,是TEAM_ID球队表的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队.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
对不起,暂时没有工作。这也给了我非常模糊的错误:“该命令包含一个或多个错误。[,,,,,]” – PGT 2014-10-19 22:35:11
@PGT。 。 。这似乎是一个奇怪的错误,只是对您的问题中的查询进行了修改。 – 2014-10-19 22:39:24
这是一个打印出来的前端错误,我没有看到服务器端错误的特权。无论发生什么样的错误,它都会显示错误。我会通过修改您的答案来更新说明。 – PGT 2014-10-19 22:40:12