Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2014, 03:25   #1
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию Помогите в написании запроса

Всем доброго времени суток!

Возникла проблема с написанием запроса на выборку из таблиц информации. Вообщем есть 3 таблицы связанные между собой: "Ученик" , "Школа" , "Класс", заполняется всё след образом, сначала добавляется школа, затем в таблице "Класс" добавляется класс для этой школы и в "Ученик" заносятся данные об ученике и классе со школой где он учится. Вообщем делаю запрос на выборку общего кол-ва учеников в классах в каждой школе, а нужно сделать чтобы выбиралось МАКСИМАЛЬНОЕ кол-во учеников в классах в разных школах (Вывести названия классов с максимальным количеством учеников в разных школах) Вот собственно текст запроса:
select class_name , school_number , count (student.klass_id)
from (student join class on student.klass_id = class.id_klass and
student.school_id = class.id_school)
join school on class.id_school = school.id_school
group by class_name , school_number

Результат работы на скрине, помогите сделать так чтобы выбирались только по одному классу со школы, в котором максимальное кол-во учеников в сравнении с другими классами в этой школе
Изображения
Тип файла: jpg вйцуйцу.jpg (120.7 Кб, 145 просмотров)
Teror4uks вне форума Ответить с цитированием
Старый 07.01.2014, 05:18   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Попробуйте использовать функцию MAX()
Streletz вне форума Ответить с цитированием
Старый 07.01.2014, 11:49   #3
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Попробуйте использовать функцию MAX()
функция мах считает внутри поля, и она просто выберет самый большой номер айди и всё...
Teror4uks вне форума Ответить с цитированием
Старый 07.01.2014, 18:33   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
SELECT school_name, class_name
FROM school c
JOIN class d ON d.school_id = c.school_id
WHERE d.class_id IN (
	SELECT TOP 1 WITH TIES a.class_id
	FROM student a
	JOIN class b ON b.class_id = a.class_id
	WHERE b.school_id = c.school_id
	GROUP BY a.class_id
	ORDER BY count(a.class_id) DESC
)
Выводит все классы с максимальным количеством учеников в каждой школе (таких классов может быть несколько).
Тестировал на схеме:
школа - ид школы, название школы
класс - ид класса, ид школы, название класса
ученик - ид ученика, ид класса, имя ученика

Может быть, можно сделать без подзапросов (у меня маленький опыт в составлении запросов).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.01.2014, 23:10   #5
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
SELECT school_name, class_name
FROM school c
JOIN class d ON d.school_id = c.school_id
WHERE d.class_id IN (
	SELECT TOP 1 WITH TIES a.class_id
	FROM student a
	JOIN class b ON b.class_id = a.class_id
	WHERE b.school_id = c.school_id
	GROUP BY a.class_id
	ORDER BY count(a.class_id) DESC
)
Выводит все классы с максимальным количеством учеников в каждой школе (таких классов может быть несколько).
Тестировал на схеме:
школа - ид школы, название школы
класс - ид класса, ид школы, название класса
ученик - ид ученика, ид класса, имя ученика

Может быть, можно сделать без подзапросов (у меня маленький опыт в составлении запросов).
Спасибо, что ответил)) скажи пожалуйста а что значит SELECT TOP 1 WITH TIES ? я прост никак не могу понять какое поле он выбирает?
Teror4uks вне форума Ответить с цитированием
Старый 07.01.2014, 23:21   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

TOP 1 вернет только первую строку из набора, а TOP 1 WITH TIES все первые строки, которые совпадают по параметру ORDER BY, наверное. Подробнее - http://msdn.microsoft.com/ru-ru/library/ms189463.aspx.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.01.2014, 23:35   #7
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
TOP 1 вернет только первую строку из набора, а TOP 1 WITH TIES все первые строки, которые совпадают по параметру ORDER BY, наверное. Подробнее - http://msdn.microsoft.com/ru-ru/library/ms189463.aspx.
IBExpert не может это переварить... печалька
Teror4uks вне форума Ответить с цитированием
Старый 08.01.2014, 10:13   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT V.school_number,X.class_name,V.MaxCount
  FROM (SELECT L.school_id,L.school_number,MAX(U.CountStudent) AS MaxCount
          FROM school L,
            (SELECT c.school_id,c.class_id,COUNT(*) AS CountStudent
               FROM class c JOIN student s ON s.class_id=c.class_id
               GROUP BY c.school_id,c.class_id) U
          WHERE L.school_id=U.school_id
          GROUP BY L.school_id,L.school_number) V,
       (SELECT c.school_id,c.class_id,c.class_name,COUNT(*) AS CountStudent
          FROM class c JOIN student s ON s.class_id=c.class_id
          GROUP BY c.school_id,c.class_id,c.class_name) X
  WHERE V.school_id=X.school_id AND V.MaxCount=X.CountStudent
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2014, 11:50   #9
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Аватар, я даже не знаю как тебя благодарить, ты просто МЕГА КРУТОЙ ЧЕЛОВЕК!!!! СПАСИБО ТЕБЕ ОГРОМНОЕ !!!
Teror4uks вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в написании SrGars Помощь студентам 7 19.10.2013 15:32
моя последняя надежда в написании запроса hend230 SQL, базы данных 0 17.12.2012 08:34
Помогите в написании кода... sobol556 Паскаль, Turbo Pascal, PascalABC.NET 0 23.03.2009 19:49
Помогите в написании пожалуйста: SViRT Паскаль, Turbo Pascal, PascalABC.NET 15 07.10.2008 21:57