我感谢每个人的帮助和耐心,因为我继续学习将大型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.
我在这里读过其他几篇文章,但无法弄清楚我做错了什么。
答案 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记录不具有相同的风险值),并且很高兴知道你永远不会得到重复的记录,潜在的问题可能会以其他意想不到的方式结束其丑陋的头脑。