![]() |
Вопрос по SQL
Помогите пожалуйста сделать такой SQL запрос: надо высчитать максимальное среднее значение по определеному столбцу, знаю как найти максимальное значение, знаю как найти среднее, но как это вмести объединить? В книжках и мануалах прочитал только что вложеных агрегатных запросов делать незя, но ни где не нашел как решить эту проблему.
|
Дык вроде среднее значение по определению одно - что ты понимаешь под "максимальным средним"?
|
«Максимальное среднее» высчитывается обычно за несколько периодов или итераций, т.е. просто берется максимум среди средних значений за каждый период (итерацию). Сразу по всему столбцу данных же можно вычислить только одно среднее. Задача видимо требует уточнения условия.
|
да виноват не корректно задал вопрос, а дело вот в чем у меня вот такие 3 таблицы, нарисовал как мог :) , -- – внешний ключ
Код:
таблица: ГРУППА СТУДЕНТ ЭКЗАМЕН |
Вот до чего дошел я:
Код:
SELECT s.stud_id stud_id, cath_id, avgm FROM student s,З.Ы. Кстати, на чем пишешь? Если на Oracle (как и я), то может стоит заколбасить процедурку на PL/SQL? |
[QUOTE=Ghost]Вот до чего дошел я:[CODE]
SELECT s.stud_id stud_id, cath_id, avgm FROM student s, Цитата:
Может я что-то недопонял, но по моему то что ты написал чуть-чуть не то т.к. необходимо найти на каждой кафедре студента с наибольшим средним балом, то отсюда следует, что надо группировать именно по полю имя кафедры а не по каким либо другим, потому что на одной кафедре могут быть (и есть) разные группы, а уже потом в каждой группу выбирать максимальный средний бал. Если бы можно делать вложенный агрегатные запросы, то это выглядело наверно так : Код:
SELECT Группа.Кафедра, Студент.Фамилия, Max(Avg(Экзамен.Оценка) AS [Avg-Оценка])Я пытался делать с вложенными запросами : Код:
SELECT Группа.Кафедра, Студент.Фамилия, Avg(Экзамен.Оценка) AS [Avg-Оценка]Так что я все сижу и думаю как сделать эту хрень...... |
А вот такие штучки а Accesse можно?
Код:
select k.kafedra, k.student, k.avgradeКод:
SELECT Группа.Кафедра, Студент.Фамилия, Max(Avg(Экзамен.Оценка) AS [Avg-Оценка]) |
Интересная задачка. Самому стало интересно. Сделал финт ушами: объеденил средний балл и номер студента в одно поле с разделителем ",," - максимально ищется нормально, остается только его разбить на части. У меня, правда, таблицы несколько отличаются:
Код:
CREATE TABLE UNIVERSITY (Код:
select univ_id, substr(csm, 1, instr(csm, ',,') - 1) maxmark,Решение, конечно, дубовое, но все-таки выдает верный результат. Хотя есть проблемы, связанные с тем, что максимальный средний балл могут иметь несколько студентов в университете (на кафедре), а в моем примере выводится только один из них, имеющий максимальный идентификатор (номер). З.Ы. К сожалению, переложить и проверить это решения для Access'а не могу в виду его (Access'а) хронического отсутствия и незнания. Но, думаю, ход моих мыслей тебе понятен. |
Цитата:
Код:
Max(Avg(Экзамен.Оценка)Теперь по первому примеру. в первом подзапросе Код:
select G.K kafedra, S.SNAME student, AVG(E.GRADE) avgradeв третьем подзапросе Код:
select G.K kafedra, AVG(E.GRADE) avgradeТ.о. имея средний бал каждого студента и средний бал по каждой кафедре нельзя найти на каждой кафедре студента с наибольшим средним балом. А теперь почему запрос в котором вызывается третий подзапрос пытается найти кафедру с максимальным средним балом, я переделал запрос что бы Access его понял Код:
SELECT k.kafedra, k.student, k.avgradeИз подчиненного запроса, который не использует ключевое слово EXISTS в предложении FROM главного запроса, возвращается более одного поля. Укажите в инструкции SELECT подчиненного запроса возвращение только одного поля. (Ошибка 3306) по моему это ошибка вот тут Код:
MAX(m.avgrade) |
Вы совершенно правы, в том подзапросе закралась ошибочка, он должен быть таким же как и первый. Ведь идея заключается вот в чем, получаем множество студентов со средними значениями по кафедрам и получаем множество студентов с максимальными значениями по кафедрам, на основе первого запроса,. И из первого множества выбираем только те что входят во второе. Тем самым показывая 'злощастных' студентов.
В oracle это работает: Код:
SQL> select k.kafedra, k.student, k.avgrade |
Цитата:
Код:
И еще не могу понять как работает вот это Код:
substr(csm, 1, instr(csm, ',,') - 1) |
Вложений: 1
Вот наваял тебе решение в Аксессе (Аксеса2003). Там три запроса, конечный результат выдает запрос под названием Result.
|
Всем большее ааааагромное спасибо !
to obrp: принцип понял, пытаюсь "перевести" Аксесу. to Guns_linger: просто хочу это все запихнуть в один запрос. |
| Часовой пояс GMT +4, время: 22:02. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.