Сумма вычисляемого поля возвращает неверный результат в запросе MS Access? - PullRequest
1 голос
/ 24 июня 2011

У меня есть эти 2 таблицы:

Table1

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


Table2

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

Я хочу сделать запрос, который объединяет две таблицы и создает вычисляемое поле (Доход * Ставка). Но когда я использую конструктор запросов 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


Запрос версии 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 : Здесь я добавляю СУММ Расчетного поля. Этот запрос возвращает 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 запрос для этой цели?

Я знаю, что мог бы просто сделать новый запрос поверх Запрос version1 , который дает правильную сумму. Но я бы хотел избежать двух запросов для этой цели.

1 Ответ

2 голосов
/ 24 июня 2011
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]. 

при повторном сохранении и редактировании запроса. Это дает тот же результат, хотя. Так что все работает отлично.

...