复杂的交叉表查询问题

发布于 2024-09-20 00:54:23 字数 2657 浏览 7 评论 0原文

我有以下 2 个表:

1) Companies

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 之间的数字,描述正在部署的人员类型。出于此查询的目的,我对每个公司的类型 2 员工感兴趣,然后对类型 3 和类型 3 的总和感兴趣。每个日期 4 个。我最终想要得到的是一个如下所示的交叉表:

交叉表

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

问题是最后一列 - 类型 3 和类型 4 员工的总和。我当前的交叉表包括除 sum 列之外的所有内容,如下所示:

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;

I have the following 2 tables:

1) Companies

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

Note that TypeID is a number between 1 and 5 describing what type of person is being deployed. For the purposes of this query, I'm interested in Type2 employees for each company and then the sum of Types 3 & 4 for each date. What I eventually want to end up with is a crosstab that looks like the following:

Crosstab

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

The problem is that final column - the sum of Type 3 and Type 4 employees. The current crosstab that I have includes everything except that sum column and looks like the following:

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;

The second part of that WHERE clause is just limiting the data by some form controls. Anyway - I'm having a lot of trouble getting that final column. Anyone have any ideas?

Edit: Building on the solution provided by Remou below, here's what the final query ended up looking like:

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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倦话 2024-09-27 00:54:23

您可以使用子查询:

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;

You can use a subquery:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文