Sql 如何查询架构中没有成员的团队

Sql 如何查询架构中没有成员的团队,sql,Sql,在我的数据库模式中,我有俱乐部、球队和球员,我想创建一个报告,统计俱乐部中的球队总数,以及没有球员的球队数量。输出类似于: CLUB #TEAMS #EMPTYTEAMS Cobras 5 0 Eagles 7 2 我的模式在以下伪代码中描述: TABLE CLUB ID int NAME string TABLE TEAM ID int NAME string TABLE PLAYER ID int NAME str

在我的数据库模式中,我有俱乐部、球队和球员,我想创建一个报告,统计俱乐部中的球队总数,以及没有球员的球队数量。输出类似于:

CLUB      #TEAMS  #EMPTYTEAMS
Cobras    5       0
Eagles    7       2
我的模式在以下伪代码中描述:

TABLE CLUB
  ID int
  NAME string

TABLE TEAM
  ID int
  NAME string

TABLE PLAYER
  ID int
  NAME string

TABLE CLUB_TEAM
  ID int
  CLUB_ID int   -- foreign key into CLUB
  TEAM_ID int   -- foreign key into TEAM

TABLE MEMBERSHIP
  ID int
  PLAYER_ID int -- foreign key into PLAYER
  TEAM_ID int   -- foreign key into TEAM
一些样本数据:

CLUB
0  Eagles
1  Cobras

TEAM
0  Eagles U10
1  Eagles U11
2  Eagles U12
...
7  Cobras U11
8  Cobras U12
9  Cobras U13
...

PLAYER
0 John Doe
1 Jane Doe
...

CLUB_TEAM
0 0 0  - The Eagles Club has an U10 team
1 0 1
2 0 2
...
7 1 7
8 1 8
9 1 9

MEMBERSHIP
0 0 7  - John plays for Cobras U11
1 1 9  - His older sister, Jane, plays for Cobras U13
我已经设法开发了一个查询,可以提供每个俱乐部的球队数量:

  SELECT CLUB.ID, CLUB.NAME, COUNT(CLUB_TEAM.ID) AS "#TEAMS"
  FROM CLUB
  INNER JOIN CLUB_TEAM
    ON CLUB_TEAM.CLUB_ID = CLUB.ID
  INNER JOIN TEAM
    ON CLUB_TEAM.TEAM_ID = TEAM.ID
  GROUP BY CLUB.ID

但是,我无法扩展此查询以包括团队成员数据和统计没有球员的团队。有什么建议吗?

也许这会有帮助。由于没有示例数据,我无法对其进行测试,因此可能存在语法错误(或两个!),但希望您能理解。基本上,将成员表汇总为一行,给出每个团队的成员计数,然后将其加入原始查询。合并处理团队没有成员的情况,因此在左侧联接上返回一个NULL值,该值被转换为零。我相信PostgreSQL支持公共表表达式(即我在这里使用的WITH子句),这是当今SQL数据库的标准

WITH team_membership AS (
     SELECT team_id, COUNT(*) AS membercount 
       FROM membership
)
SELECT club.id,
       club.name,
       COUNT(club_team.id) AS "#TEAMS",
       SUM(CASE WHEN COALESCE(membercount, 0) = 0 THEN 1 ELSE 0 END) AS "#EMPTYTEAMS"   
FROM   club
       INNER JOIN club_team
               ON club_team.club_id = club.id
       INNER JOIN team
               ON club_team.team_id = team.id
       LEFT JOIN team_membership
              ON club_team.team_id = team_membership.team_id
GROUP  BY club.id,
          club.name 

我设法找出了如何追踪空团队,我的解决方案类似于@user9601310的第二部分

SELECT CLUB.ID, CLUB.NAME, COUNT(MEMBERSHIP.TEAM_ID) AS "#MEMBERS"
FROM CLUB
INNER JOIN CLUB_TEAM
  ON CLUB_TEAM.CLUB_ID = CLUB.ID
INNER JOIN TEAM
  ON CLUB_TEAM.TEAM_ID = TEAM.ID
LEFT JOIN MEMBERSHIP -- LEFT JOIN to capture teams with no members
  ON MEMBERSHIP.TEAM_ID = TEAM.ID
GROUP BY CLUB.ID, TEAM.ID
HAVING COUNT(MEMBERSHIP.TEAM_ID) = 0
在此基础上,我以以下方式包装了此查询(…):

SELECT CLUB.ID, COUNT(#MEMBERS) AS "#EMPTYTEAMS"
FROM ( ... ) AS "QUERY"
GROUP BY CLUB.ID
SELECT SET1.ID, CLUB.NAME, "#TEAMS", "#EMPTYTEAMS"
FROM ( query 1 ) SET1
INNER JOIN ( query 2 ) SET2
ON SET1.ID = SET2.ID
这给了我每个俱乐部的空队数量

然后,我将我的两个问题——上面的一个问题和问题中的一个问题——以以下方式结合在一起:

SELECT CLUB.ID, COUNT(#MEMBERS) AS "#EMPTYTEAMS"
FROM ( ... ) AS "QUERY"
GROUP BY CLUB.ID
SELECT SET1.ID, CLUB.NAME, "#TEAMS", "#EMPTYTEAMS"
FROM ( query 1 ) SET1
INNER JOIN ( query 2 ) SET2
ON SET1.ID = SET2.ID

这给了我想要的结果。不太优雅,但内部查询相当直接,它们的组合也是如此。

请添加几行示例数据和预期结果。预期结果位于问题的顶部。我将添加一些示例数据。外部联接?您使用的是哪种数据库管理系统?您通常按照所选的相同列进行分组,但作为设置函数参数的列除外。