не групповая функция для одной группы при использовании max - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь получить максимум 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 голосов
/ 06 июля 2018

Один из вариантов - использовать текущий запрос (без 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. Попробуйте использовать SUM в аналитической форме .

Вот простой пример, который показывает, что я имею в виду, основываясь на схеме Скотта.

Вот что у вас сейчас:

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 (если это то, что вы ищете. Если нет, объясните, что вы хотите получить в результате).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...