(此答案是在 Access 2010 下开发和测试的。)
首先,我们需要一个查询,为您提供按部门划分的申请总数。简单:
SELECT DepartmentId, Count(*) AS CountOfApplications
FROM ApplicationMapping
GROUP BY DepartmentId
说给我们
DepartmentId CountOfApplications
------------ -------------------
1 4
2 1
您已经有了按部门计算可部署应用程序的查询,可能看起来像这样
SELECT
am.DepartmentId,
Sum(IIf(a.Deployable,1,0)) AS CountOfDeployable
FROM
ApplicationMapping AS am
INNER JOIN
Applications AS a
ON am.ApplicationId = a.ApplicationId
GROUP BY DepartmentId
假设它给了我们
DepartmentId CountOfDeployable
------------ -----------------
1 2
2 1
那么我们需要做的就是将这两个查询连接在一起
SELECT
q1.DepartmentId,
q2.CountOfDeployable / q1.CountOfApplications AS pctDeployable
FROM
(
SELECT DepartmentId, Count(*) AS CountOfApplications
FROM ApplicationMapping
GROUP BY DepartmentId
) AS q1
INNER JOIN
(
SELECT
am.DepartmentId,
Sum(IIf(a.Deployable,1,0)) AS CountOfDeployable
FROM
ApplicationMapping AS am
INNER JOIN
Applications AS a
ON am.ApplicationId = a.ApplicationId
GROUP BY DepartmentId
) AS q2
ON q1.DepartmentId = q2.DepartmentId
我们得到
DepartmentId pctDeployable
------------ -------------
1 0.5
2 1
编辑:
如果您想要一个包含所有部门的列表,即使是那些没有任何应用程序的部门,那么只需将整个前面的查询包装在另一个对 [Department] 表执行外部联接的查询中:
SELECT
d.DepartmentId,
d.DepartmentName,
IIf(IsNull(calc.DepartmentId),0,calc.CountOfApplications) AS totalApplications,
calc.pctDeployable
FROM
Department AS d
LEFT JOIN
(
SELECT
q1.DepartmentId,
q1.CountOfApplications,
q2.CountOfDeployable / q1.CountOfApplications AS pctDeployable
FROM
(
SELECT DepartmentId, Count(*) AS CountOfApplications
FROM ApplicationMapping
GROUP BY DepartmentId
) AS q1
INNER JOIN
(
SELECT
am.DepartmentId,
Sum(IIf(a.Deployable,1,0)) AS CountOfDeployable
FROM
ApplicationMapping AS am
INNER JOIN
Applications AS a
ON am.ApplicationId = a.ApplicationId
GROUP BY DepartmentId
) AS q2
ON q1.DepartmentId = q2.DepartmentId
) AS calc
ON d.DepartmentId = calc.DepartmentId
返回
DepartmentId DepartmentName totalApplications pctDeployable
------------ -------------- ----------------- -------------
1 Department1 4 0.5
2 Department2 1 0
3 Department3 0