如何在连接后列出不同的列并计数?

如何在连接后列出不同的列并计数?

问题描述:

我有三个表:如何在连接后列出不同的列并计数?

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; 
+0

对不起,暂时没有工作。这也给了我非常模糊的错误:“该命令包含一个或多个错误。[,,,,,]” – PGT 2014-10-19 22:35:11

+0

@PGT。 。 。这似乎是一个奇怪的错误,只是对您的问题中的查询进行了修改。 – 2014-10-19 22:39:24

+0

这是一个打印出来的前端错误,我没有看到服务器端错误的特权。无论发生什么样的错误,它都会显示错误。我会通过修改您的答案来更新说明。 – PGT 2014-10-19 22:40:12

试试这个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