我已经构建了我认为是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#));
问题是,sum字段非常不正确。
调试
问题的根本原因是Properties.ID
有多个条目。
所以我认为选择不明显?有没有办法解决这个问题?
Properties.ID
实际上是一个帐户标识符,可以与多个属性相关联;所以我无法将Properties.ID
限制为每个ID一个记录...想法?
答案 0 :(得分:1)
看起来History.ID
是一个独特的字段,或者至少对每个属性都是唯一的
通过将其包含在您的查询中,总和将对该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
答案 1 :(得分:0)
试试这个:
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子句用作Filter,请参阅here。请改用WHERE Part。
例如,对于...HAVING SumOfNET_VALUE > 200
来说,HAVING是合理的。