2010-09-15 129 views
1

我有以下2个表:复杂的交叉表查询问题

1)公司

ID  CompanyName  Abbreviation  Notes 
1  CompanyA    CA   ... 
2  CompanyB    CB   ... 
3  CompanyC    CC   ... 

2)PlannedDeployments

ID  CompanyID  TypeID  DepDate  NumDeployed 
1   1    2   09/2010   5 
2   1    2   10/2010   5 
3   1    3   09/2010   3 
4   1    3   10/2010   3 
5   1    4   10/2010   4 
6   2    2   12/2010   10 
7   2    4   10/2010   1 
8   3    2   11/2010   6 

注意TYPEID之间的号码1和5描述了什么类型的人正在部署。就本查询而言,我对每个公司的Type2员工感兴趣,然后对每个日期的类型3 & 4的总和感兴趣。我最终想落得一个交叉表,看起来像下面这样:

交叉

Date/Company CompanyA CompanyB CompanyC  SumOfTypes3and4 
09/2010   5          3 
10/2010   5          8 
11/2010         6     
12/2010      10 

的问题是,最后一列 - 3型和4型员工的总和。当前交叉表,我有包括不同之处在于总和柱一切,如下所示:

TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"] 
SELECT PlannedDeployments.DepDate 
FROM PlannedDeployments LEFT JOIN Companies ON Companies.ID=PlannedDeployments.CompanyID 
WHERE PlannedDeployments.TypeID=2 AND (PlannedDeployments.DepDate Between FormFieldValue("Form", "Control") AND FormFieldValue("Form", "Control")) 
GROUP BY PlannedDeployments.DepDate 
PIVOT Companies.CompanyName; 

的第二部分即WHERE子句仅通过某种形式的控制的限制的数据。无论如何 - 我在收到最后一栏时遇到了很多麻烦。有人有主意吗?

编辑:大厦由以下Remou提供的解决方案,这里的最终查询结束什么看起来像:

TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"] 
SELECT PlannedDeployments.DepDate, q.SumOfNumDeployed 
FROM (SELECT PlannedDeployments.DepDate, Sum(PlannedDeployments.NumDeployed) AS SumOfNumDeployed 
FROM PlannedDeployments 
WHERE (((PlannedDeployments.[TypeID]) In (3,4))) 
GROUP BY PlannedDeployments.DepDate) AS q 
RIGHT JOIN (PlannedDeployments 
INNER JOIN Companies ON PlannedDeployments.CompanyID = Companies.ID) 
ON q.DepDate = PlannedDeployments.DepDate 
WHERE PlannedDeployments.TypeID=2 
    AND (PlannedDeployments.DepDate Between FormFieldValue("Form", "Control") 
    AND FormFieldValue("Form", "Control")) 
GROUP BY PlannedDeployments.DepDate, q.SumOfNumDeployed 
PIVOT Companies.CompanyName; 

回答

1

您可以使用子查询:

TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"] 
SELECT PlannedDeployments.DepDate, Sum(q.SumOfNumDeployed) AS SumOfSumOfNumDeployed 
FROM (SELECT PlannedDeployments.DepDate, Sum(PlannedDeployments.NumDeployed) AS SumOfNumDeployed 
FROM PlannedDeployments 
WHERE (((PlannedDeployments.[TypeID]) In (3,4))) 
GROUP BY PlannedDeployments.DepDate) AS q 
RIGHT JOIN (PlannedDeployments 
INNER JOIN Companies ON PlannedDeployments.CompanyID = Companies.ID) 
ON q.DepDate = PlannedDeployments.DepDate 
WHERE PlannedDeployments.TypeID=2 
    AND (PlannedDeployments.DepDate Between FormFieldValue("Form", "Control") 
    AND FormFieldValue("Form", "Control")) 
GROUP BY PlannedDeployments.DepDate 
PIVOT Companies.CompanyName; 
+0

这让我真正的接近,但它不完全正确。我在最后一栏中查找的是一个总结日期,这与我在上面的查询中看到的并不完全相同。根据我的实际数据,我期待如下:1/2010:2,2/2010:2,3/2010:4,4/2010:6 而我得到的是:1/2010: 2,2/2010:4,3/2010:12,4/2010:24. – wtollett 2010-09-16 01:13:45

+0

您需要受限于表单上日期的子查询?如果是这样,您可以将where语句添加到子查询中。 – Fionnuala 2010-09-16 01:21:41

+0

不是 - 我最后所要做的就是从第二行删除Sum(),然后在倒数第二行的GROUP BY子句中添加'q.SumOfNumDeployed',数据看起来很完美。谢谢你的帮助。 – wtollett 2010-09-16 01:35:32