【问题标题】:Complicated Crosstab Query Question复杂的交叉表查询问题
【发布时间】:2010-09-15 23:19:00
【问题描述】:

我有以下 2 个表:

1) 公司

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

2) 计划部署

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 员工感兴趣,然后对每个日期的 Type 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;

【问题讨论】:

    标签: ms-access crosstab


    【解决方案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;
    

    【讨论】:

    • 这让我非常接近,但它并不完全正确。我在最后一列中寻找的是按日期求和,这与我在上述查询中看到的不太一样。鉴于我的实际数据,我期待类似:1/2010:2、2/2010:2、3/2010:4、4/2010:6 而我得到的是:1/2010:2, 2/2010: 4, 3/2010: 12, 4/2010: 24.
    • 您还需要受表单日期限制的子查询吗?如果是这样,您可以在子查询中添加 where 语句。
    • 不——我最终要做的就是从那里的第二行删除 Sum(),然后在倒数第二行的 GROUP BY 子句中添加一个“q.SumOfNumDeployed”,然后数据看起来很完美。感谢您的帮助。
    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2011-05-22
    • 2023-03-25
    相关资源
    最近更新 更多