使用max时不是单组分组功能

时间:2018-07-06 11:52:37

标签: oracle

我正在尝试使用下面的查询得出最大的avrg,但是我却很反感

  

ORA-00937:不是单组分组功能   00937. 00000-“不是单组分组功能”   *原因:
  *操作:第1行错误:

SELECT B.STUDENT_ID,
       A.FRIST_NAME,
       A.FATHER_NAME,
       A.LAST_NAME,
       SUM (B.GRADE) AS SUM_GRADE,
       COUNT(B.COURSE_ID) AS COURSE_COUNT,
       max(SUM(B.GRADE) / COUNT(B.COURSE_ID)) AS AVRG
  FROM STUDENT A,
       STUDENT_COURSE B
  WHERE A.STUDENT_ID = B.STUDENT_ID
GROUP BY A.FRIST_NAME, A.FATHER_NAME, A.LAST_NAME, B.STUDENT_ID;

当我删除max函数时,此错误消失了,任何人都可以帮助我为什么? 我尝试使用max,但收到错误消息,提示无效的国家/地区

与此查询搭配使用的任何方式?

1 个答案:

答案 0 :(得分:2)

一种选择是将当前查询(不使用MAX)用作内联视图,并将MAX函数应用于“求和/计数”:

SELECT student_id,
       first_name,
       father_name,
       last_name,
       sum_grade,
       course_count,
       -- this:
       MAX(avrg) max_avrt
FROM (-- your current query 
       SELECT b.student_id,
              a.frist_name,
              a.father_name,
              a.last_name,
              SUM(b.grade) AS sum_grade,
              COUNT(b.course_id) AS course_count,
              SUM(b.grade) / COUNT(b.course_id) AS avrg
       FROM student a,
            student_course b
       WHERE a.student_id = b.student_id
       GROUP BY a.frist_name,
                a.father_name,
                a.last_name,
                b.student_id
     )
GROUP BY student_id, first_name, father_name, last_name, sum_grade, course_count;

但是,您不会获得任何的效果,因为由于使用外部GROUP BY子句,您仍然会获得相同的记录集。考虑以其{strong>分析形式使用SUM

这是一个简单的示例,它基于Scott的模式显示了我的意思。

这就是您现在拥有的:

SQL> select deptno, sum(sal) / count(*) ssc
  2  from emp
  3  group by deptno
  4  order by deptno;

    DEPTNO        SSC
---------- ----------
        10 2916,66667
        20 2258,33333
        30 1566,66667

显然,您想选择第一个SSC值(2916)。如果应用我之前写的内容(即使用该查询作为内联视图),则会得到以下信息:

SQL> select deptno, max(ssc) max_ssc
  2  from (select deptno, sum(sal) / count(*) ssc
  3        from emp
  4        group by deptno
  5       )
  6  group by deptno
  7  order by deptno;

    DEPTNO    MAX_SSC
---------- ----------
        10 2916,66667
        20 2258,33333
        30 1566,66667

SQL>

没有改善,是吗?因此,您可能需要分析功能

SQL> select deptno,
  2         max(sum(sal) / count(*)) over (order by deptno) max_ssc
  3  from emp
  4  group by deptno
  5  order by deptno;

    DEPTNO    MAX_SSC
---------- ----------
        10 2916,66667
        20 2916,66667
        30 2916,66667

这确实返回了所需的MAX值(如果这就是您要的值。如果没有,请解释一下您希望得到的结果)。