2010 具有嵌套 JOIN、WHERE 和 GROUP BY 的访问查询

2010 Access Query with nested JOIN, WHERE and GROUP BY

感谢大家的帮助和耐心,因为我通过将大型 Excel/vba 系统转换为 Access 来继续学习。

我有以下查询:

SELECT AccountWeeklyBalances.AccountNumber,
AccountWeeklyBalances.AccountBalance,
AccountWeeklyBalances.AccountDate,
AccountMaster.AccountName,
AccountCurrentModel.Model,
ModelDetailAllHistory.Risk
FROM ((AccountWeeklyBalances 
INNER JOIN AccountMaster 
    ON AccountMaster.[AccountNumber] = AccountWeeklyBalances.AccountNumber)

  INNER JOIN AccountCurrentModel
       ON AccountWeeklyBalances.AccountNumber=AccountCurrentModel.AccountNumber)

     INNER JOIN ModelDetailAllHistory
       ON AccountCurrentModel.Model=ModelDetailAllHistory.ModelName

             WHERE AccountWeeklyBalances.AccountDate=[MatchDate]

;

这行得通,但我想按模型分组。我尝试添加

GROUP BY AccountCurrentModel.Model

GROUP BY ModelDetailAllHistory.ModelName

在 WHERE 子句之后,但都给我一个错误:

Tried to execute a query that does not include the specified expression
   'AccountNumber' as part of an aggregate function.

我在这里阅读了其他几篇文章,但无法弄清楚我做错了什么。

这取决于您要做什么。如果您只想按 ModelName 对 AccountBalance 求和,则必须从 select 语句中删除所有其他列。如果您想要每个帐户的每个模型的总和,那么您只需将 AccountNumber 添加到 GROUP BY,可能在 ModelName 之前。

聚合时,您不能在 select 列表中包含任何非聚合函数(min、max、sum 等)或分组依据的内容,因为无法表示在查询结果中。您如何通过 ModelName 显示 AccountBalance 的总和,但还包括 AccountNumber?这样做的唯一方法是同时按 AccountNumber 和 ModelName 进行分组。

----编辑----

在评论中讨论后,我对发生的事情有了更清晰的认识。没有聚合,但每个模型的 ModelDetailAllHistory 中有多个记录。但是,我们需要从 table 中获得的唯一价值是风险,而且每个模型的价值始终相同。所以我们需要消除重复的 Risk 值。这可以通过加入子查询而不是直接加入 ModelDetailAllHistory

来完成
 INNER JOIN (SELECT DISTINCT ModelName, Risk FROM ModelDetailAllHistory) mh
   ON AccountCurrentModel.Model=mh.ModelName

 INNER JOIN (SELECT ModelName, max(Risk) FROM ModelDetailAllHistory GROUP BY ModelName) mh
   ON AccountCurrentModel.Model=mh.ModelName

这两种方法都将多个风险值折叠为每个模型的单个值,从而消除了重复记录。我倾向于选择第一个选项,因为如果由于某种原因单个模型有多个风险值,您最终会得到重复的记录并且您会知道出了什么问题。使用 max() 基本上是从 ModelDetailAllHistory 中选择与给定模型匹配的任意记录并从中获取风险值,因为您知道该模型的所有风险值应该相同。我不喜欢这种方法的是它会向您隐藏数据不一致(例如,如果出于某种原因,同一模型的某些 ModelDetailAllHistory 记录没有相同的风险值),虽然很高兴认识您永远不会得到重复的记录,潜在的问题最终可能会以其他意想不到的方式出现。