SQL 查询使用连接获取计数

TSQL Queryto get Counts using Joins

我有一个非常简单的查询,用于获取两个单独的计数。我 运行 遇到的问题是,通过连接,我得到的数字不准确。

是否有更好的方法从不同的表中获取两个单独的计数?

SELECT   g.[group] AS groupName,
         COUNT(d.departmentDesc) AS total,
         COUNT(skg.Skillset) AS totalSkillsets
FROM     dbo.TFS_Groups AS g
         LEFT OUTER JOIN
         TFS_Departments_Groups AS d
         ON g.[group] = d.tfsGroup
         LEFT OUTER JOIN
         TFS_Skillsets_Groups AS skg
         ON skg.tfsGroup = g.[Group]
GROUP BY g.[group]
ORDER BY groupName ASC;

试试 APPLY:

SELECT   g.[group] AS groupName,
         ca1.c1 AS total,
         ca2.c2 AS totalSkillsets
FROM     dbo.TFS_Groups AS g
OUTER APPLY (SELECT COUNT(*) AS c1 FROM TFS_Departments_Groups AS d WHERE g.[group] = d.tfsGroup) ca1
OUTER APPLY (SELECT COUNT(*) AS c2 FROM TFS_Skillsets_Groups AS skg WHERE g.[group] = skg.tfsGroup) ca2

如果您追求唯一值,您可以将 DISTINCT 放入您的 COUNT 中。

SELECT   g.[group] AS groupName,
         COUNT(DISTINCT d.departmentDesc) AS total,
         COUNT(DISTINCT skg.Skillset) AS totalSkillsets
...

我怀疑问题是您有两个一对多关系导致了额外的行。

减少这种情况的一种方法是在子查询中预先聚合,即

SELECT   g.[group] AS groupName,
         d.vol AS total,
         skg.vol AS totalSkillsets

FROM     dbo.TFS_Groups AS g

         LEFT OUTER JOIN
         (SELECT tfsgroup, count(*) as Vol 
         FROM   TFS_Skillsets_Groups
         group by tfsgroup) AS skg
         ON skg.tfsGroup = g.[Group]

         LEFT OUTER JOIN
         (SELECT tfsgroup, count(*) as Vol 
         FROM   TFS_Departments_Groups 
         group by tfsgroup) AS d
         ON d.tfsGroup = g.[Group]

ORDER BY groupName ASC;