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;
我有一个非常简单的查询,用于获取两个单独的计数。我 运行 遇到的问题是,通过连接,我得到的数字不准确。
是否有更好的方法从不同的表中获取两个单独的计数?
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;