计算字段的总和在MS Access查询中返回错误的结果?

时间:2011-06-24 10:28:12

标签: sql ms-access aggregate-functions

我有这两张桌子:

表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 I获得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


查询版本1B :我删除字段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个查询用于此目的?

我知道我可以在查询版本1 之上创建一个新查询,以获得正确的总和。但我想避免为此目的进行2次查询。

1 个答案:

答案 0 :(得分:2)

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 Query Designer(在设计模式下)进行此更改,您必须切换到SQL View。

另请注意,SELECT DISTINCT部分可以在括号中输入,如

(SELECT DISTINCT Type,Rate FROM t_rate)

但Access会将其转换为

[SELECT DISTINCT Type,Rate FROM t_rate]. 

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