【问题标题】:2010 Access Query with nested JOIN, WHERE and GROUP BY2010 具有嵌套 JOIN、WHERE 和 GROUP BY 的访问查询
【发布时间】:2018-09-30 05:24:25
【问题描述】:

感谢大家的帮助和耐心,因为我通过将大型 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.

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

【问题讨论】:

  • 错误信息似乎很清楚。你没有聚合,因此你不能分组。不过,您可以申请 Order By。

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


【解决方案1】:

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

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

----编辑----

在 cmets 中讨论后,我对正在发生的事情有了更清晰的了解。没有聚合,但是每个Model的ModelDetailAllHistory中有多条记录。但是,我们需要从该表中获取的唯一值是风险,并且每个模型始终相同。所以我们需要消除重复的风险值。这可以通过加入子查询来完成,而不是直接加入 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 记录没有相同的风险值),虽然很高兴认识你'永远不会得到重复的记录,潜在的问题最终可能会以其他意想不到的方式抬起头来。

【讨论】:

  • 谢谢@KKloke。我要做的只是列出信息,而不是求和或任何东西。现在唯一获得风险的地方是来自 ModelDetailAllHistory,每个模型可以有多个记录 - 因此尝试分组。我考虑过 SELECT DISTINCT,但我也无法让它工作。
  • 这意味着每个模型可以有多个风险值,对吧?或者,对于给定模型,ModelDetailAllHistory 中每条记录的风险值是否相同,即使有多个记录与该模型相关?
  • 每条记录的风险值相同。 (是的,我知道 - 糟糕的设计。我不需要 ModelMaster,除了这个报告中的风险值。也许我稍后会更改它。)
  • 好的,我现在更好地理解了这个问题。有几种方法可以做到这一点。我将添加到我的原始答案中,以便更容易找到。
  • 在我的原始答案中的----EDIT----之后检查。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多