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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2013, 16:18   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию SQL MIN()

здравствуйте! Есть три таблицы:
Код:
create table "doctor"(
	id INT identity  primary key,
	name varchar(255) NOT NULL,
	firstname varchar(255) NOT NULL
)
Код:
create table "attude_d_p"(
	id INT primary key,
	id_doctor INT NOT NULL,
	id_specialty INT NOT NULL,
	foreign key (id_doctor) references doctor (id) on delete no action on update cascade,
	foreign key (id_specialty) references specialty (id) on delete no action on update cascade,
	check(id_doctor = left(id,1)),
	check(id_specialty = right(id,1))
)
Код:
create table "reception"(
	id INT identity primary key,
	id_doctor INT NOT NULL,/*идентификатор взятый из таблицы attude_d_p*/
	id_patient INT NOT NULL,
	date smalldatetime NOT NULL,
	foreign key (id_doctor) references attude_d_p (id) on delete no action on update cascade,
	foreign key (id_patient) references patient (id) on delete no action on update cascade,
	check(len(date)=19)
)
необходимо вывести доктора, принявшего всех меньше пациентов.
вот запрос на количество принятых пациентов каждым доктором:
Код:
select count(reception.id_patient) from reception group by reception.id_doctor
вот а как вывести доктора, принявшего всех меньше пациентов, используя вложенный запрос (как я понимаю без вложенных запросов тут не обойтись)
Olejik вне форума Ответить с цитированием
Старый 23.06.2013, 16:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
select TOP 1 reception.id_doctor,count(reception.id_patient)
  from reception 
  group by reception.id_doctor
  ORDER BY 2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2013, 16:37   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
select TOP 1 reception.id_doctor,count(reception.id_patient)
  from reception 
  group by reception.id_doctor
  ORDER BY 2
работает, спасибо, а вот через MIN можно как то решить это?
Olejik вне форума Ответить с цитированием
Старый 23.06.2013, 17:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно так попробовать, многоэтажно, зато вернет несколько записей, если их не одна
Код:
SELECT U.id_doctor
  from reception U
  group by U.id_doctor
  HAVING count(U.*)=(SELECT MIN(T.CountRec) FROM (select count(*) AS CountRec from reception group by id_doctor) T)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2013, 19:39   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно так попробовать, многоэтажно, зато вернет несколько записей, если их не одна
Код:
SELECT U.id_doctor
  from reception U
  group by U.id_doctor
  HAVING count(U.*)=(SELECT MIN(T.CountRec) FROM (select count(*) AS CountRec from reception group by id_doctor) T)
да, спасибо огромное, а вот что за буква T такая? в конце например запроса? она за что отвечает? Она используется как переменная, я правильно понял? Подскажите пожалуйста
Olejik вне форума Ответить с цитированием
Старый 23.06.2013, 19:50   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

T это имя набора запроса (select count(*) AS CountRec from reception group by id_doctor
Она используется в MIN(T.CountRec), поскольку запрос анонимен его просто необходимо именовать, если нужно использовать его результаты где-то еще.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
списке целых чисел все элементы между max и min заменить полусуммой max и min Roman one C/C++ Базы данных 0 20.12.2012 12:14
MAX \ MIN sql реакции mrgrudge PHP 4 14.07.2011 10:20
Матрица Min-Max и Max-Min boog Помощь студентам 3 23.12.2010 13:19
Min Linux Пепел Феникса Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 7 29.10.2010 10:09
Получить: min(a1,..., an). Владимир_король Помощь студентам 3 29.04.2010 11:49