2010使用嵌套JOIN,WHERE和GROUP BY的Access Query

时间:2018-04-19 16:08:32

标签: sql ms-access select group-by ms-access-2010

我感谢每个人的帮助和耐心,因为我继续学习将大型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模型。我尝试添加

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.

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

1 个答案:

答案 0 :(得分:1)

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

汇总时,您不能在选择列表中包含任何不是聚合函数(最小值,最大值,总和等)或您正在分组的内容,因为有' s无法在查询结果中表示。你如何通过ModelName显示AccountBalance的总和,还包括AccountNumber?唯一的方法是按AccountNumber和ModelName进行分组。

---- ---- EDIT

在评论中讨论后,我更清楚地知道发生了什么。没有聚合,但每个Model的ModelDetailAllHistory中有多个记录。但是,我们从该表中需要的唯一值是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

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