【问题标题】:MS Access Create Query with x number of fields depending on other table's keyMS Access 根据其他表的键创建具有 x 个字段的查询
【发布时间】:2020-03-14 15:14:22
【问题描述】:

我正在尝试创建一个查询来汇总每周销售额。我有两个销售团队(可能更及时)和销售人员分配给每个团队。我需要计算每个团队和团队内部的销售百分比。

我想要一个永久查询而不是生成 VBA。我知道我可以使用 VB 生成的 CREATE 和 INSERT 语句创建一个 Temp 表,但该表不会随着信息添加到 sales 表而更新。

创建此查询后,我将需要再构造至少两个查询,其中计算来自该数据的百分比,因为在打开表单时需要该信息。

结果查询应该输出类似于以下示例的内容,考虑到可以在 WHERE 子句中从第 1 周到第 Y 周过滤周范围,并且 SALESTEAM 表中的所有 ID_SALES(从 1 到 X)行都是一列自己的。

    This are the tables to extract the data from

    TABLE Sales
          ID as AutoNumber
          ID_CUSTOMER AS Number
          ID_SALES as Number
          SaleDate as Date/Time
          SalesAmt as Currency
    END TABLE

    TABLE SALESTEAM
          ID_SALES as AutoNumber
          Name as String
          StartDate as Date/Time
          EndDate as Date/Time
          Active as Yes/No
          AssignedTo as Number
    END TABLE

    This would be a sample construct of the SELECT if made statically for the current records in SalesTeam Table using the All ID_Sales from all records

SELECT DatePart("yyyy", SalesDate) as SalesYear, DatePart("ww", SalesDate) as SalesWeek, 
           (SUM(SalesAmt) FROM SALES WHERE ID_Sales = 1 AND SalesDate BETWEEN @StartDate AND @EndDate) as Sales1,
           (SUM(SalesAmt) FROM SALES WHERE ID_Sales = 2 AND SalesDate BETWEEN @StartDate AND @EndDate) as Sales2,
           (SUM(SalesAmt) FROM SALES WHERE ID_Sales = 3 AND SalesDate BETWEEN @StartDate AND @EndDate) as Sales3,
           ...
           (SUM(SalesAmt) FROM SALES WHERE ID_Sales = X AND SalesDate BETWEEN @StartDate AND @EndDate) as SalesX
    FROM Sales GROUP BY SalesYear, SalesWeek ORDER BY SalesYear, SalesWeek

    +------+----------------------------------------------------------------------+
    | WEEK |                              ID_SALES                                |
    +------+----------------------------------------------------------------------+
    | WEEK |         1        |         2        |     ...     |         X        |
    +------+------------------+------------------+-------------+------------------+
    +  W1  |  SUM(SALESAMT)   |  SUM(SALESAMT)   |     ...     |  SUM(SALESAMT)   |
    +      | WK1 ID_SALES = 1 | WK1 ID_SALES = 2 |     ...     | WK1 ID_SALES = X |
    +------+------------------+------------------+-------------+------------------+
    |      |                  |                  |             |                  |
    +------+------------------+------------------+-------------+------------------+
    +  WY  |  SUM(SALESAMT)   |  SUM(SALESAMT)   |     ...     |  SUM(SALESAMT)   |
    +      | WKY ID_SALES = 1 | WKY ID_SALES = 2 |     ...     | WKY ID_SALES = X |
    +------+------------------+------------------+-------------+------------------+

【问题讨论】:

  • 你的问题是什么?您似乎已经有一个查询正在执行此操作。
  • SalesTeam 表将及时增加,因为最终用户将无法自行更改查询。这需要是动态的。
  • 不知道这两张表的schema很难给你答案。
  • 架构已编辑为原始帖子
  • 我认为您可以使用Crosstab Query 来做到这一点。您可以用 SQL 编写或在查询设计器中编写。

标签: ms-access select sum multiple-columns


【解决方案1】:

您所需的输出结构为交叉表样式查询。如果您不确切知道您将拥有多少列(在这种情况下为销售人员),则访问跨表查询是错误的并且难以绑定到报告。我建议先输出一个标准报告,然后返回并制作一个跨表版本。也就是说,让我们从更合适和规范化的表结构开始,例如: SalesPersonTeam 表实现了 SalesPersons 和 Teams 之间的多对多关系。您可以随意添加团队和销售人员,并在团队之间随意移动销售人员。 您的第一个查询将是:

我的星际迷航数据给出的($ 代表金压拉丁): 注意 CrossTab 被选中而不是 Select。

要获得百分比而不是总和,您必须解决一个错误: 但请注意,已选择生成表选项卡访问无法使用基于 dlookup 的计算列运行交叉表查询,因此请创建一个临时表。然后将交叉表基于临时表。清理使用表单加载报告并让表单创建临时表。删除报告关闭事件中的临时表。 这是获取百分比和结果的交叉表:

要获得基于团队的结果的交叉表,只需像这样更改查询: 遵循与之前相同的程序来获得带有百分比的交叉表。 如果您坚持使用基于交叉表的报告,您将不得不就如何处理可变数量的列做出一些决定

【讨论】:

  • 谢谢 mazoula...我一直在乱涂乱画,有点了解如何根据我的需要调整 TRANSFORMT...PIVOT 语句。该声明是对我最初问题的回答。我一直在进行一些查询以获取 CrossTab 从中获取数据的查询。尚未收到报告,但我会在设计报告时牢记您的建议。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多