2010-04-28 63 views
3

我有一个表,显示员工的部署,为不同类型的部署,在每月指定位置:有条件地在单个select语句中多次合计相同的列?

ID | Location_ID | Date | NumEmployees | DeploymentType_ID 

举个例子,一些记录可能是:

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 

我需要做的是按日期总结不同类型的人,这样的结果是这个样子:

Date | Total Perm | Total Temp | Total Supp 
12/2010 |  13  |  5  |  1 
01/2011 |  10  |  2  |  1 

目前,我已经创建对于像这样每个部署类型都有一个单独的查询:

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

我们会打电话给该查询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; 

请注意,我目前正在建设的假设下最终查询的地点将只具有临时或支持的员工,如果他们也有永久雇员。因此,我可以使用永久员工结果作为基本表创建连接。考虑到我目前掌握的所有数据,这个假设依然存在,但理想情况下,我想摆脱这种假设。

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

回答

4
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 
+0

+1:11只在你身后秒这段时间...我越来越近。 :) – 2010-04-28 21:57:06

+0

@Mark:大声笑,upvote那 – RedFilter 2010-04-28 22:23:10

+0

哇!我真的走了很长的路。谢谢你的帮助。 – wtollett 2010-04-28 22:25:29

1

试试这个:

SELECT 
    Date, 
    SUM(CASE WHEN DeploymentType_ID=1 THEN NumEmployees ELSE 0 END) AS "Total Permanent", 
    SUM(CASE WHEN DeploymentType_ID=2 THEN NumEmployees ELSE 0 END) AS "Total Temporary", 
    SUM(CASE WHEN DeploymentType_ID=3 THEN NumEmployees ELSE 0 END) AS "Total Support" 
FROM tblDeployment 
GROUP BY Date;