【问题标题】:not a GROUP BY expression [duplicate]不是 GROUP BY 表达式[重复]
【发布时间】:2014-12-28 02:36:48
【问题描述】:

我正在创建以下 sql 查询:

SELECT B.AFLEVERING_ID,A.NAAM, COUNT(B.AFLEVERING_ID) AS aantal_keer_bekeken
FROM BEKEKENVIA B, AFLEVERING A
WHERE A.AFLEVERING_ID = B.AFLEVERING_ID
GROUP BY B.AFLEVERING_ID
ORDER BY B.AFLEVERING_ID ASC;

为什么会报错:

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 42 Column: 24

为什么会这样,我该如何解决?它是 Oracle SQL。

【问题讨论】:

  • 我认为您需要按不属于聚合的所有列进行分组,请尝试将 A.NAAM 包含在您的组中
  • 如果没有聚合,就按它分组;你在GROUP BY中缺少的A.NAAM

标签: sql database oracle expression


【解决方案1】:

SELECT 中列出的不是聚合函数结果的每一列(SUM()AVG()COUNT()MIN()MAX() 等)都必须在@987654327 中列出@。您选择了 B.AFLEVERING_IDA.NAAM,因此您的 group by 必须同时包含这两个。

SELECT B.AFLEVERING_ID,A.NAAM, COUNT(B.AFLEVERING_ID) AS aantal_keer_bekeken
FROM BEKEKENVIA B, AFLEVERING A
WHERE A.AFLEVERING_ID = B.AFLEVERING_ID
GROUP BY B.AFLEVERING_ID, A.NAAM
ORDER BY B.AFLEVERING_ID ASC;

【讨论】:

  • 感谢为我工作:)
【解决方案2】:

为什么会这样,我该如何解决?它是 Oracle SQL。

为什么会这样: 想想数据库要做什么 您已要求按 B.Afevering_Id 分组的所有 B.Afevering_Id 的计数 但是您还在您的 select 语句中包含了 A.Naam。由于每行的每个 A.Naam 都可能不同,因此数据库不知道要返回哪个 A.Naam,因为您没有按它分组

所以说数据看起来像:

1 blue
1 red
1 white
2 green
2 purple
2 pink
2 green

如果您只是返回每个 aflvering_ID 的计数,您会得到

3 1's and
4 2's

但你也说过你想要 A.Naam

所以数据库说我不知道​​你想要 1 中的蓝色、红色、白色中的哪一个。 你有4个选项,我只能用1个;那么哪个?因缺乏规则而无法决定;所以引擎返回一个错误。

如果您将 A.Naam 添加到组中,您可能无法获得所需的结果,如果您说 max 或 min,您可能会得到您想要的,但数据库无法确定在这种情况下该怎么做,因为这还不够已向数据库引擎提供指令以提供一致的结果。引擎知道这一点;这就是您收到错误的原因。

我该如何解决: 这个问题的答案取决于期望的结果

  1. 您可以简单地从选择中删除 A.NAAM
  2. 使用 wm_Concat 或 List_Agg 获取所有值的单独列表
  3. 将其添加到 group by 以单独返回每一行(在我的示例中,绿色 2 将返回 2 的计数,所有其他将是 1
  4. 使用 min 或 max 只返回最高或最低的 A.Naam

也存在其他选项,但这四个选项之一可能会解决您想要做的事情。问题是您追求的预期结果是什么?

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2012-12-07
    • 2011-06-29
    • 2017-09-21
    • 2011-04-24
    • 2011-08-14
    • 2012-10-03
    • 2013-04-11
    相关资源
    最近更新 更多