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

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

我有三张桌子:

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”,则会出错。

sql asp.net sql-server asp-classic adodb
2个回答
1
投票

这是你想要的吗?

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;

1
投票

试试这个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 
© www.soinside.com 2019 - 2024. All rights reserved.