【问题标题】:Why am I getting the ORA-00979: not a GROUP BY expression error为什么我收到 ORA-00979: not a GROUP BY 表达式错误
【发布时间】:2021-09-12 00:09:33
【问题描述】:
SELECT * 
FROM (SELECT a.ID,
SUM (A.AMT) AS AMT,
RANK ()
OVER (PARTITION BY a.ID ORDER BY b.NO DESC)
AS rnk
FROM TBL1  A 
JOIN TBL2 B
ON a.ID = b.ID AND b.DATE <= a.DATE
 WHERE     b.CD = 'AB'
AND a.DESC = 'P'
AND a.TYP_DESC = 'SEC'
AND a.actg_prd_id between (TO_CHAR(ADD_MONTHS(TO_DATE('&&DATE','YYMM'),-2),'YYMM')) and '&&DATE'
group by a.ID
) a
 WHERE a.rnk = 1

有人可以帮我解决这个问题吗?当我在没有“SUM”的情况下运行它时,查询工作正常,但是一旦我尝试对 AMT 字段求和,我的 group by 表达式就无法正常工作,并且我不断收到错误“ORA-00979: not a GROUP BY expression ”。

【问题讨论】:

  • 您在 SELECT 中使用 b.NO,但在 GROUP BY 中未按 b.NO 分组。根据您的目标,从 SELECT 中删除 b.NO 或添加到 GROUP BY。
  • 请说明您想要完成的任务。样本数据、期望的结果和清晰的解释都会有所帮助。
  • @MTO,我实际上是在特定时间段内引入一组人口。 RNK 在那里是为了删除重复记录。我只是用 where 子句中的所有表达式推导总体,并为总体中的每条记录提取 AMT 值。我可以轻松搞定,问题是当我尝试总结 AMT 时,Group by 无法正常工作。
  • 为什么你认为你会有重复的值?如果您想在聚合之前 忽略重复项,则需要先过滤,然后再聚合。如果您想在 聚合之后忽略重复项,则无需担心,因为您不会有任何重复项。

标签: sql oracle group-by


【解决方案1】:

RANK 是一个分析函数,而不是一个聚合函数,您使用的 b.NO 内部没有聚合,所以它会引发异常。

不要在RANK 中使用未聚合的值,或者删除RANK 函数。


但是,将RANKPARTITION BY 子句一起使用不会有太大作用,因为您GROUP BY a.ID 然后查询将聚合并为每个a.ID 值仅返回一行。假设您在RANK 分析函数中是PARTITION BY a.ID,并且聚合中的每个a.ID 永远只有一行,那么您将永远不会得到高于RANKRANK 值,并且可以使用:

SELECT a.ID,
       SUM (A.AMT) AS AMT,
       1 AS rnk
FROM   TBL1  A 
       JOIN TBL2 B
       ON a.ID = b.ID AND b."DATE" <= a."DATE"
WHERE  b.CD = 'AB'
AND    a."DESC" = 'P'
AND    a.TYP_DESC = 'SEC'
AND    a.actg_prd_id between TO_CHAR(ADD_MONTHS(TO_DATE('&&DATE','YYMM'),-2),'YYMM') and '&&DATE'
GROUP BY a.ID

如果您试图找到具有最低值的SUM(a.AMT) 行,那么您需要删除PARTITION BY 子句并使用RANK() OVER ( ORDER BY SUM(a.AMT) )

SELECT *
FROM   (
  SELECT a.ID,
         SUM (A.AMT) AS AMT,
         RANK() OVER (ORDER BY SUM(A.AMT)) AS rnk
  FROM   TBL1  A 
         JOIN TBL2 B
         ON a.ID = b.ID AND b."DATE" <= a."DATE"
  WHERE  b.CD = 'AB'
  AND    a."DESC" = 'P'
  AND    a.TYP_DESC = 'SEC'
  AND    a.actg_prd_id between TO_CHAR(ADD_MONTHS(TO_DATE('2101','YYMM'),-2),'YYMM') and '2101'
  GROUP BY a.ID
)
WHERE  rnk = 1

db小提琴here

【讨论】:

  • RANK 纯粹是为了删除重复记录。
  • @ace123 聚合后不会有任何重复记录。
猜你喜欢
  • 2021-10-26
  • 2022-01-22
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多