ORA-00979:不是sql developer中的GROUP BY表达式

ORA-00979:不是sql developer中的GROUP BY表达式,sql,oracle,group-by,Sql,Oracle,Group By,此查询抛出一个错误。函数和分组依据不能同时使用?您需要在分组依据中包含完整的表达式 SELECT DISTINCT s.spriden_id, swkadfu.goremal_email_address(spriden_pidm,'TAMU','goremal_email_address') AS email, sum(tbraccd_amount) from tbraccd join spriden s on s.spriden_pi

此查询抛出一个错误。函数和分组依据不能同时使用?

您需要在
分组依据中包含完整的表达式

SELECT DISTINCT
         s.spriden_id,
         swkadfu.goremal_email_address(spriden_pidm,'TAMU','goremal_email_address') AS email,
         sum(tbraccd_amount) 
from tbraccd
  join spriden s on s.spriden_pidm = tbraccd_pidm
           AND s.spriden_ntyp_code = 'UIN'
           AND s.spriden_change_ind = 'I'
group by spriden_id,swkadfu.goremal_email_address
having sum(tbraccd_amount) >='20000';

这里有一个你错过的例子

首先,功能:

group by spriden_id, wkadfu.goremal_email_address(spriden_pidm,'TAMU','goremal_email_address')
正确地称之为:

  • 所有未聚合的列都应
    • 在您的例子中,它们是
      e.ename
      e.deptno
      (这是函数的一个参数;函数本身可以,但不必是
      group by
      子句的一部分;这取决于您期望的结果。如果省略整个函数,代码将执行)
  • 如果有
    分组依据
    ,则不需要使用
    distinct
    ;不会伤害任何东西,但也不会有帮助<代码>分组依据将确保返回不同的值
  • summary返回一个数字,因此-不要将该条件括在单引号中,即它应该是
    =20000
    ,而不是
    ='20000'
看起来是这样的:

SQL> create or replace function goremal (par_deptno in number, par_null in varchar2)
  2    return varchar2
  3  is
  4    retval dept.dname%type;
  5  begin
  6    select dname into retval
  7      from dept
  8      where deptno = par_deptno;
  9
 10    return retval;
 11  end;
 12  /

Function created.
SQL> select e.ename,
  2         goremal(e.deptno, null) as dept_name,
  3         sum(e.sal) sum_sal
  4  from emp e
  5  group by e.ename, e.deptno
  6  having sum(e.sal) > 100;

ENAME      DEPT_NAME          SUM_SAL
---------- --------------- ----------
SMITH      RESEARCH               800
JONES      RESEARCH              2975
FORD       RESEARCH              3000
CLARK      ACCOUNTING            2450
<snip>

为什么在同一个查询中同时使用
DISTINCT
和聚合函数(
SUM
)?不能按函数分组。在函数使用的字段上尝试使用group by。@在尝试使用group by之前,我使用了distinct。。谢谢你的指点谢谢你的详细说明。。。非常有帮助。。将尝试此操作尝试基于wkadfu.goremal\u电子邮件地址(spriden\u pidm、'TAMU'、'goremal\u email\u address')的函数索引。
。语法有点正确,除了下划线。我真的不知道:swkadfu.goremal_email_地址(spriden_pidm,'TAMU,'goremal_email_address')应该是。。。
select s.spriden_id,
       swkadfu.goremal_email_address(spriden_pidm,'TAMU','goremal_email_address') as email,
       sum(tbraccd_amount) 
from tbraccd
  join spriden s on s.spriden_pidm = tbraccd_pidm
           and s.spriden_ntyp_code = 'UIN'
           and s.spriden_change_ind = 'I'
group by spriden_id,
         spriden_pidm
having sum(tbraccd_amount) >= 20000;
SELECT 
  s.spriden_id, 
  swkadfu.goremal_email_address(
    spriden_pidm, 'TAMU', 'goremal_email_address'
  ) AS email, 
  sum(tbraccd_amount) 
from 
  tbraccd 
  join spriden s on s.spriden_pidm = tbraccd_pidm 
  AND s.spriden_ntyp_code = 'UIN' 
  AND s.spriden_change_ind = 'I' 
group by 
  s.spriden_id, 
  swkadfu.goremal_email_address(
    spriden_pidm, 'TAMU', 'goremal_email_address'
  ) 
having 
  sum(tbraccd_amount) >= '20000';