在单个select语句中有条件地对同一列进行多次求和?

wto*_*ett 4 sql ms-access select

我有一张表格显示每个月在给定位置的各种部署类型的员工部署:

ID | Location_ID | Date | NumEmployees | DeploymentType_ID
Run Code Online (Sandbox Code Playgroud)

例如,一些记录可能是:

 1 | L1 | 12/2010 | 7 | 1 (=Permanent)
 2 | L1 | 12/2010 | 2 | 2 (=Temp)
 3 | L1 | 12/2010 | 1 | 3 (=Support)
 4 | L1 | 01/2011 | 4 | 1
 5 | L1 | 01/2011 | 2 | 2
 6 | L1 | 01/2011 | 1 | 3
 7 | L2 | 12/2010 | 6 | 1
 8 | L2 | 01/2011 | 6 | 1
 9 | L2 | 12/2010 | 3 | 2
Run Code Online (Sandbox Code Playgroud)

我需要做的是按日期对各种类型的人进行求和,以便结果看起来像这样:

Date    | Total Perm | Total Temp | Total Supp
12/2010 |     13     |     5      |      1
01/2011 |     10     |     2      |      1
Run Code Online (Sandbox Code Playgroud)

当前,我为每种部署类型创建了一个单独的查询,如下所示:

SELECT Date, SUM(NumEmployees) AS "Total Permanent"
FROM tblDeployment
WHERE DeploymentType_ID=1
GROUP BY Date;
Run Code Online (Sandbox Code Playgroud)

我们称该查询为qSumPermDeployments。然后,我使用几个联接来组合查询:

SELECT qSumPermDeployments.Date, qSumPermDeployments.["Total Permanent"] AS "Permanent"
    qSumTempDeployments.["Total Temp"] AS "Temp"
    qSumSupportDeployments.["Total Support"] AS Support
FROM (qSumPermDeployments LEFT JOIN qSumTempDeployments 
    ON qSumPermDeployments.Date = qSumTempDeployments.Date) 
LEFT JOIN qSumSupportDeployments 
    ON qSumPermDeployments.Date = qSumSupportDeployments.Date;
Run Code Online (Sandbox Code Playgroud)

请注意,我目前正在根据一个位置仅具有临时雇员或支持雇员(如果他们也有长期雇员)的假设构建最终查询。因此,我可以使用永久雇员结果作为基表来创建联接。考虑到我目前拥有的所有数据,该假设成立了,但理想情况下,我希望脱离该假设。

最后,我的问题。有没有一种方法可以简化为单个查询,还是最好将其分为多个查询-如果没有其他原因使可读性更好。

Red*_*ter 5

SELECT Date, 
    SUM(case when DeploymentType_ID = 1 then NumEmployees else null end) AS "Total Permanent", 
    SUM(case when DeploymentType_ID = 2 then NumEmployees else null end) AS "Total Temp", 
    SUM(case when DeploymentType_ID = 3 then NumEmployees else null end) AS "Total Supp"
FROM tblDeployment
GROUP BY Date
Run Code Online (Sandbox Code Playgroud)