【问题标题】:Sum of calculated field returns wrong result in MS Access query?计算字段的总和在 MS Access 查询中返回错误的结果?
【发布时间】:2011-06-25 00:04:20
【问题描述】:

我有这两张桌子:

表 1

CustomerID Area     Type                   Revenue
1          Europe   Institutional Clients   10
2          Asia     Institutional Clients   10
3          USA      Institutional Clients   10


表2

Report Country       Type                   Rate
DK                 Institutional Clients    2
SE                 Institutional Clients    2
FI                 Institutional Clients    2

我想创建一个连接两个表的查询并创建一个计算字段 (Revenue*Rate)。但是当我使用 MS Access 查询设计器时,计算字段的总和返回错误的结果。





查询版本 1: 此查询返回每个客户 20 个(这是正确的)和总共 60 个,但这些字段没有分组到 1 行。 (如果我删除字段 CustomerID 和 Area 我得到 1 行,但结果显示为 20?!Se version1B 下面)

SELECT t_Customer.CustomerID, t_Customer.Area, t_Customer.Type, [Revenue]*[Rate] AS CalculatedField
FROM t_Customer INNER JOIN t_Rate ON t_Customer.Type = t_Rate.Type
GROUP BY t_Customer.CustomerID, t_Customer.Area, t_Customer.Type, [Revenue]*[Rate];

返回:

CustomerID   Area   Type                  CalculatedField
1            Europe Institutional Clients   20
2            Asia   Institutional Clients   20
3            USA    Institutional Clients   20


查询 version1B:我删除了 CustomerID 和 Area 字段。

SELECT t_Customer.Type, ([Revenue]*[Rate]) AS CalculatedField
FROM t_Customer INNER JOIN t_Rate ON t_Customer.Type = t_Rate.Type
GROUP BY t_Customer.Type, ([Revenue]*[Rate]);

返回:

Type                 CalculatedField
Institutional Clients   20




查询版本2: 在这里,我添加了计算字段的 SUM。 此查询返回 180(这是错误的)。

SELECT t_Customer.Type, Sum(([Revenue]*[Rate])) AS CalculatedField
FROM t_Customer INNER JOIN t_Rate ON t_Customer.Type = t_Rate.Type
GROUP BY t_Customer.Type;

返回:

Type                   CalculatedField
Institutional Clients   180



有没有办法使用 MS Access 查询设计器来显示计算字段的正确总和,所以我只能为此目的进行 1 个查询?

我知道我可以在 Query version1 之上进行一个新的查询,得出正确的总和。但我想避免为此目的进行 2 次查询。

【问题讨论】:

  • 您如何知道哪个客户的费率是多少?如果您通过 Type 列,所有 3 个费率都与 Customer 表中的每一行连接,因此您得到 180 (3*60)
  • 有没有第三张表来描述ReportCountry和Area的关系?这是您尝试编写的查询的关键
  • 我不知道每个客户的费率。我同意这是 table2 的糟糕表格设计。但只需将 table2 视为某种主表,它可以保存更多的静态数据,而不是与单个客户相关联,而是与 Type 或 ReportCountry 相关联。
  • 没有第三张表。所以我的问题是按照它们的方式构建表格,如何在这些条件下做出正确的计算总和。

标签: sql ms-access aggregate-functions


【解决方案1】:
SELECT t_Customer.CustomerID,
       t_Customer.Area, 
       t_Customer.Type, 
       [Revenue] * [Rate] AS CalculatedField
  FROM t_Customer 
  JOIN (SELECT DISTINCT Type, Rate 
         FROM t_rate) t_rate ON t_Customer.Type = t_Rate.Type

如果你想要一排那么:

  SELECT t_Customer.Type, 
         SUM([Revenue] * [Rate]) AS CalculatedField
    FROM t_Customer 
    JOIN (SELECT DISTINCT Type, Rate 
            FROM t_rate) t_rate ON t_Customer.Type = t_Rate.Type
GROUP BY t_Customer.Type

返回:

Type                    CalculatedField
Institutional Clients   60


请注意,无法使用 Access 查询设计器(在设计模式下)进行此更改,您必须切换到 SQL 视图。

另请注意,SELECT DISTINCT 部分可以像这样在括号内输入

(SELECT DISTINCT Type,Rate FROM t_rate)

但 Access 会将其转换为

[SELECT DISTINCT Type,Rate FROM t_rate]. 

当您再次保存和编辑查询时。 但它产生相同的结果。所以它工作得很好。

【讨论】:

  • 在值为“Institutional Clients”的类型字段上进行连接。并且由于table2中“Institutional Clients”的3个重复值,table1中的每一行被join了3次,使得结果大了3倍。除非我使用 2 个查询,一个用于加入,一个用于求和。
  • 将子查询与您将与主表连接的每种类型的速率的 DISTINCT 值一起使用。现在似乎不需要分组依据。
  • 有没有一种简单的方法可以使用 Access 查询设计器做到这一点,并且仍然只有 1 个查询?
  • @MOLAP 您可以将@niktrs 答案粘贴到 Access 查询(SQL 模式)中。在 Access 中完全没问题
  • 用子查询创建一个视图,然后将主表和视图连接起来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多