得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句

Posted

技术标签:

【中文标题】得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句【英文标题】:Getting ORA-00979: not a GROUP BY statement without any aggregate functions 【发布时间】:2018-05-12 20:27:27 【问题描述】:

我的查询中有一个巨大的CASE 语句,除了一部分之外它工作正常。

当我在 WHEN 子句之一中添加 EXISTS 子句时,我得到 ORA-00979: not a GROUP BY statement。我不知道为什么,因为SELECT 中没有聚合函数。如果我评论整个EXISTS 部分或其中的所有LEFT JOINs(以及WHERE 中的最后两个条件),查询工作正常,所以我认为问题出在连接上。

我很确定我使用了所有需要的列进行连接,但即使我没有,多个返回行应该如何影响EXISTS 的结果?据我所知,它只是检查是否返回了 0 行或更多行。

虽然查询中有GROUP BY 语句,但我只是将整个CASE 复制到那里,如果我注释掉EXISTS 子句,它就可以工作。

我不能发布整个代码,因为它有 500 行,希望这就足够了:

WHEN NVL(BH_LAST_WEEK.QTY,0) < NVL(BH_PREV_WEEK.QTY,0)
 AND F.TOTFCST > F.TOTHIST
 AND EXISTS (SELECT 1
             FROM SCPOMGR.DFUVIEW DV_INNER
             INNER JOIN SCPOMGR.ITEM I_INNER
                     ON I_INNER.ITEM = DV_INNER.DMDUNIT
             LEFT JOIN BASEHIST BH_LAST_WEEK_INNER
                    ON BH_LAST_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND BH_LAST_WEEK_INNER.LOC = DV_INNER.LOC
                   AND BH_LAST_WEEK_INNER.STARTDATE = F.STARTDATE
             LEFT JOIN BASEHIST BH_PREV_WEEK_INNER
                    ON BH_PREV_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND BH_PREV_WEEK_INNER.LOC = DV_INNER.LOC
                   AND BH_PREV_WEEK_INNER.STARTDATE = F.STARTDATE - 7
             LEFT JOIN (SELECT *
                        FROM EFF_PRICES 
                        WHERE STARTDATE = F.STARTDATE) EP_LAST_WEEK_INNER
                    ON EP_LAST_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND EP_LAST_WEEK_INNER.LOC = DV_INNER.LOC
             LEFT JOIN EFF_PRICES EP_PREV_WEEK_INNER
                    ON EP_PREV_WEEK_INNER.DMDUNIT = DV_INNER.DMDUNIT
                   AND EP_PREV_WEEK_INNER.LOC = DV_INNER.LOC
                   AND EP_PREV_WEEK_INNER.STARTDATE = F.STARTDATE - 7
             WHERE I_INNER.U_HL4_CODE = I.U_HL4_CODE
               AND DV_INNER.LOC = F.LOC
               AND DV_INNER.DMDGROUP = 'RETAIL'
               AND DV_INNER.U_LEVEL = '000'
               AND EP_LAST_WEEK_INNER.EFFPRICE / EP_PREV_WEEK_INNER.EFFPRICE < 0.75
               AND BH_LAST_WEEK_INNER.QTY > BH_PREV_WEEK_INNER.QTY * (1 + 0.6 * F.TOTHIST / F.TOTFCST)
              )

【问题讨论】:

是否有可能在子选择中的外部目标表中有一列不在外部查询的GROUP BY 中? 嗯,是的,例如F.STARTDATE - 7 不在外部GROUP BY 中。但它不在输出中,所以我认为这不会导致麻烦...... 但是您的情况是在外部WHERE 或在外部查询的选定列列表中,不是吗?您不能在那里使用外部查询的任何列,它既不是GROUP BY 的一部分,也不是传递给聚合函数的。这也适用于在那个地方的相关子查询中使用它们,DBMS 也无法确定要从那里的许多值中选择哪个值。 @stickybit 。 . .您应该将您的 cmets 放入答案中。 【参考方案1】:

您说,您在子选择中有一个列F.STARTDATE,它是外部FROM(包括任何JOINed 表)的目标表之一的列。您的CASE 位于外部WHERE 或外部SELECT 之后的列列表中。

WHERE 或外部(或独立)查询的SELECT 之后的列列表中,您不能使用任何列,该列既不是GROUP BY 的一部分,也不是传递给聚合函数(如果当然有GROUP BY)。这也适用于在上述这些地方的相关子查询中使用它们。 DBMS 也无法确定从那里可能有很多值中选择哪个值。

【讨论】:

好吧,我认为起初 CASE 是为每一行计算的,然后才对值进行分组。至少这是有道理的。

以上是关于得到 ORA-00979: 不是没有任何聚合函数的 GROUP BY 语句的主要内容,如果未能解决你的问题,请参考以下文章

没有聚合函数的 GROUP BY

没有聚合函数的 GROUP BY

ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式

ORA-00979: 不是 GROUP BY 表达式

ORA-00979: 不是 GROUP BY 表达式

SQL 组错误 ORA-00979