2010-09-15 125 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