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