oracle 运行出错:不是group by 表达式 求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 运行出错:不是group by 表达式 求解相关的知识,希望对你有一定的参考价值。

select score.stu_id,course.coll_id,score.term,course.grade,sum(course.xuefen) from score,course
group by score.stu_id
having score.cou_id=course.cou_id and score.mark>59;

不是你任何一个条件都得写在having子句里的,你这种条件都应该写在where里才行

select score.stu_id,
course.coll_id,
score.term,
course.grade,
sum(course.xuefen) 
from score,course
where score.cou_id=course.cou_id and score.mark>59
group by score.stu_id;
参考技术A select score.stu_id,course.coll_id,score.term,course.grade,sum(course.xuefen) from score,course
group by score.stu_id
having score.cou_id=course.cou_id and score.mark>59;

SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式

【中文标题】SQLSyntaxErrorException: ORA-00979: 不是 GROUP BY 表达式【英文标题】:SQLSyntaxErrorException: ORA-00979: not a GROUP BY expression 【发布时间】:2020-03-31 14:54:28 【问题描述】:

我在 java 中运行此代码时收到此错误“not a GROUP BY expression”,但在 SQL Developer 中运行良好。不知道我在哪里做错了。 请大家帮忙

错误:SQLSyntaxErrorException: ORA-00979: not a GROUP BY expression

SELECT data.portfolioid AS "CUSTOMER ID",
       company.name AS "COMPANY",
       trunc(data.startdate, :format) AS "USAGE DATE",
       SUM(data.sessions) AS "SESSIONS",
       SUM(data.zerosessions) AS "ZEROSESSIONS",
       SUM(data.sms) AS "SMS",
       SUM(data.VOICEDURATION) AS "VOICEDURATION",
       SUM(data.totalbytes) AS "TOTAL BYTES",
       SUM(data.billedbytes) AS "NORMALIZED BYTES",
       sim.custom0 AS "CUSTOM1"
FROM
  (SELECT portfolioid,
          context,
          startdate,
          totalbytes,
          billedbytes,
          sessions,
          zerosessions,
          sms,
          voiceduration,
          sim.imsi
   FROM nmma_abc_mo DATA
   INNER JOIN nn_abc sim ON data.imsi = sim.imsi
   WHERE portfolioid IN
       (SELECT pf.id
        FROM nc_vt_abc cb,
             nn_abc pcb,
             nn_abc pf
        WHERE pcb.id = cb.productid
          AND pf.id = pcb.portfolioid
          AND pf.domainid = :domainid
          AND (:portfolioid = -1
               OR pf.id = :portfolioid) )
     AND data.startdate BETWEEN to_date(:startDate, 'YYYY-MM-DD HH24:MI:SS') AND to_date(:endDate, 'YYYY-MM-DD HH24:MI:SS') ) DATA
LEFT JOIN nnp_abc portfolio ON portfolio.id = data.portfolioid
LEFT JOIN nnpc_abc company ON company.id = portfolio.companyid
LEFT JOIN nnsc_v_abc sim ON sim.imsi = data.imsi
WHERE sim.custom0 IS NOT NULL
GROUP BY data.portfolioid,
         company.name,
         trunc(data.startdate, :format),
         sim.custom0
ORDER BY data.portfolioid

【问题讨论】:

一目了然,这可能是因为您的 :format 实际上是两个不同的变量,所以 Oracle 在编译时没有检查它们是否相等。尝试将日期格式移动到您的内部查询中,这样您只需要格式化一次。 这里有一些关于重复占位符的信息:Link 【参考方案1】:

正如我在 cmets 中提到的,尝试将您的日期格式移动到内部查询中,以避免像这样重复占位符:

SELECT data.portfolioid AS "CUSTOMER ID",
       company.name AS "COMPANY",
       data.usage_date AS "USAGE DATE",
       SUM(data.sessions) AS "SESSIONS",
       SUM(data.zerosessions) AS "ZEROSESSIONS",
       SUM(data.sms) AS "SMS",
       SUM(data.VOICEDURATION) AS "VOICEDURATION",
       SUM(data.totalbytes) AS "TOTAL BYTES",
       SUM(data.billedbytes) AS "NORMALIZED BYTES",
       sim.custom0 AS "CUSTOM1"
FROM   (SELECT portfolioid,
               CONTEXT,
               trunc(startdate, :format) AS USAGE_DATE
               totalbytes,
               billedbytes,
               sessions,
               zerosessions,
               sms,
               voiceduration,
               sim.imsi
        FROM   nmma_abc_mo data
        INNER  JOIN nn_abc sim ON data.imsi = sim.imsi
        WHERE  portfolioid IN (SELECT pf.id
                               FROM   nc_vt_abc cb, nn_abc pcb, nn_abc pf
                               WHERE  pcb.id = cb.productid
                               AND    pf.id = pcb.portfolioid
                               AND    pf.domainid = :domainid
                               AND    (:portfolioid = -1 OR pf.id = :portfolioid))
        AND    data.startdate BETWEEN to_date(:startDate, 'YYYY-MM-DD HH24:MI:SS') AND
               to_date(:endDate, 'YYYY-MM-DD HH24:MI:SS')

        ) data
LEFT   JOIN nnp_abc portfolio ON portfolio.id = data.portfolioid
LEFT   JOIN nnpc_abc company ON company.id = portfolio.companyid
LEFT   JOIN nnsc_v_abc sim ON sim.imsi = data.imsi
WHERE  sim.custom0 IS NOT NULL
GROUP  BY data.portfolioid, company.name, data.usage_date, sim.custom0
ORDER  BY data.portfolioid;

【讨论】:

以上是关于oracle 运行出错:不是group by 表达式 求解的主要内容,如果未能解决你的问题,请参考以下文章

同样的sql在mysql运行没有问题,在oracle会报不是group by表达式的错

不是group by 表达式

如何调试“每个 GROUP BY 表达式必须包含至少一列不是外部引用错误”

实现 GROUP BY oracle 查询导致:不是 Ruby 中的 GROUP BY 表达式

为啥这不起作用? ORA-00979: 不是 GROUP BY 表达式

Lambda表达式 group by having问题