MS Access Totals Query Sum Sum Неверный результат - PullRequest
0 голосов
/ 26 апреля 2018

Я создал простой запрос в MS Access.

Участвуют две таблицы:

  • Свойства
  • История

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

Вот мой запрос:

SELECT      Properties.Area
            , History.HIST_DATE
            , History.ID
            , Sum(History.NET_VALUE) AS SumOfNET_VALUE
FROM        Properties INNER JOIN History ON Properties.ID = History.ID
WHERE       (((History.Account_ID)=45))
GROUP BY    Properties.Area, History.HIST_DATE, History.ID
HAVING      (((Properties.Area)="MY AREA") AND 
             ((History.HIST_DATE)=#2/1/2017#));

Проблема в том, что поле суммы крайне неверно.

Отладка

Основной причиной проблемы является то, что в Properties.ID есть несколько записей. Итак, я полагаю, что выбор не отличается? Есть ли способ обойти это?
Properties.ID фактически является идентификатором учетной записи, и с ним можно связать несколько свойств; поэтому я не могу ограничить Properties.ID одной записью на удостоверение личности ... мысли?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Похоже, History.ID является уникальным полем или, по крайней мере, уникальным для каждого свойства.
Включив его в свой запрос, сумма будет сгруппирована по этому идентификатору, а также по области, так что в итоге вы получите общее количество для каждого свойства в области.

Не знаю, где Account_ID входит в него, но все равно включил его в предложение WHERE.

SELECT        Properties.Area
            , History.Hist_Date
            , SUM(History.Net_Value) AS Total_Net_Value
FROM        Properties LEFT JOIN History ON Properties.ID = History.ID
WHERE       History.Account_ID = 45 AND 
            Properties.Area = "My Area"
            History.Hist_Date=#04/27/2018#
GROUP BY      Properties.Area 
            , History.Hist_Date
0 голосов
/ 27 апреля 2018

Попробуйте это:

SELECT      Properties.Area
            , History.HIST_DATE
            , History.ID
            , Sum(History.NET_VALUE) AS SumOfNET_VALUE
FROM        Properties INNER JOIN History ON Properties.ID = History.ID
WHERE       ((History.Account_ID)=45) 
              AND (Properties.Area)="MY AREA" 
              AND (History.HIST_DATE)=#2/1/2017#))
GROUP BY    Properties.Area, History.HIST_DATE, History.ID;

Не используйте предложение HAVING в качестве фильтра, кроме агрегатной функции, см. здесь . Вместо этого используйте WHERE Part.

Если бы, например, ...HAVING SumOfNET_VALUE > 200 было бы целесообразно иметь

...