SQL-запрос
В общем ситуация первая:
Есть таблица "Курсовые_Проекты" с полями "Номер_Курсового_Проекта", "Номер_Дисциплины" и "Номер_Семестра". Нужно сделать такой запрос:
В каком семестре максимальное количество курсовых проектов?
Вторая ситуация:
Есть таблица "Контрольные_Работы" с полями "Номер_КР", "Номер_Дисциплины", "Номер_Семестра", также есть связанная по полю "Номер_Дисциплины" таблица "Дисциплины" с полями "Номер_Дисциплины" и "Название_Дисциплины". Запрос выглядит следующим образом:
Сколько контрольных работ в семестре 8 и по каким дисциплинам? (т.е. нужно подсчитать колличество КР в семестре 8 и вывести список дисциплин с этим контрольными).
Заранее спасибо за помощь!
незнаю можно ли так, не пробовал:
SELECT MAX(COUNT("Номер_Курсового_Проекта")) FROM "Курсовые_Проекты" GROUP BY "Номер_Семестра"
Код:
Невозможно использование статической функции в выражении (MAX(COUNT("Номер_Курсового_Проекта"))).
SELECT "Номер_семестра", MAX(CP_In_Semestr) AS MAX_CP_IN_SEMESTR
FROM (SELECT "Номер_семестра", COUNT("Номер_семестра") AS CP_In_Semestr
FROM "Курсовые_проекты"
GROUP BY "Номер_семестра")
GROUP BY "Номер_семестра";
Получается, что внутрений запрос выводит список семестров и колличество в них курсовых работ, а внешний должен выбирать максимальное значение кол-ва курсовых работ и выводить одну строку с номером семестра, в котором максимальное кол-во курсовых работ, и колличеством курсовых работ в этом семестре. Помогите исправить запрос.
1. Создаем запрос, который возвращает все семестры с количеством курсовых работ, результат запроса сортируем по убыванию количества курсовых работ. Внешний запрос извлекает из внутреннего первую строку (которая будет соответствовать семестру с наибольшим количеством работ)
[highlight=sql]select semester
from (select semester, count(project_no) as cnt
from projects
group by semester
order by cnt desc)
where rownum=1
[/highlight]
2. Использовать конструкцию group by ... having ...
[highlight=sql]select semester, count(project_no)
from projects
group by semester
having count(project_no) >= (select max(cnt)
from (select semester, count(project_no) as cnt
from projects
group by semester)
)
[/highlight]
[highlight=sql]
select count(workid)
from k_works
where semester=8
[/highlight]
чтобы вывести список дисциплин, по которым были работы в 8 семестре:
[highlight=sql]
select d.name
from k_works as w, disciplines as d
where w.disciplineid=d.disciplineid and w.semester=8
[/highlight]
для исключения дублирования дисциплин, можно добавить distinct
ну а если надо все одним запросом достать, то можно объединить результаты двух запросов с помощью union
select top 1 semester
from (select semester, count(project_no) as cnt
from projects
group by semester
order by cnt desc)