Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Запрос на самого трудягу


Автор: madmasm 18.10.2009, 14:49
Помогите организовать запрос, факт в том что с SQL дело раньше не имел...
Есть таблица, то есть расписание работы врачей, организованная следующим образом :
http://ipicture.ru/
необходимо найти самого загруженного по расписанию врача(id_doctor), понятно что при нахождении такового необходимо будет использовать разницу и сложение времени и без таковой структуры не обойтись:

Код
 DATEPART (datepart , date  )


просто не могу понять как  правильно организовать запрос, нужна помощь, плиз...

Автор: Gluttton 18.10.2009, 15:12
1. Пусть таблица называется t.
2. Расчет длительность загрузки платформозависима, поэтому я просто покажу разницу условно: okonchanie-nachalo. Отсюда вопрос к топикстартеру какая СУБД?

Сначала отобразим продолжительность загрузки для каждого врача за каждый день:
Код

select
    id_doctor,
    okonchanie-nachalo as work
from
    t


Затем сгрупируем продолжительность работы для каждого врача:
Код

select
    id_doctor,
    sum(okonchanie-nachalo) as work
from
    t
    group by id_doctor


И в заключении выбираем доктора с максимальной загрузкой...
В зависимости от СУБД запрос может быть составлен по разному...

Автор: madmasm 18.10.2009, 16:33
СУБД - MS SQL Server 2005, я в ней на расчете общего количесва проработаных часов сотрудником и застрял((

Автор: Gudinya 18.10.2009, 16:43
ну если стили побоку то что то типа
Код

Select * from(
Select * from
(select
    id_doctor,
    sum(okonchanie-nachalo) as work
from
    t
    group by id_doctor) x
order by x.work desc) t
Where rownum < 2

неправильно посты прочел... так что извиняюсь за написанный бред smile

Автор: Gluttton 18.10.2009, 17:36
Цитата(madmasm @  18.10.2009,  16:33 Найти цитируемый пост)
СУБД - MS SQL Server 2005, я в ней на расчете общего количесва проработаных часов сотрудником и застрял((


Рекомендую привести к минимальной учитывемой единице времени (час, минута или секунда) и по ним работать. 
Т.е. (для случая учета с точностью до минуты) берем начало, вычленяем из него часы и минуты и переводим полученое значение в минуты...
Код

03.10.2009 12.00.00 -> 12.00 -> (12*60) + 00 -> 720

То же повторяем и для времени окончания:
Код

03.10.2009 17.00.00 -> 17.00 -> (17*60) + 00 -> 1140

Вычитаем из конца начало:
Код

1140 - 720 -> 420

А потом находим сумму (в минутах) с группировкой по врачам. Далее находим максимум. И уже в самом конце переводим минуты в дни часы и т.д.

Автор: Gluttton 18.10.2009, 17:53
Gudinya, помоему вложености лишние smile ...
Код

select
    id_doctor,
    sum(okonchanie-nachalo) as work
from
    t
    where rownum<2
    group by id_doctor
    order by sum(okonchanie-nachalo) desc


Добавлено @ 17:59
madmasm, вот http://www.sql-ex.ru/help/select9.php#dtime можно посмотреть функции для работы с датами...
Оказывается в MS SQL есть чудо-функция datediff и я немного перемудрил с переводом в минуты...
Должно получиться что то вроде вот такого:
Код

select
    id_doctor,
    sum(datediff(mi, nachalo, okonchanie)) as work
from
    t
    group by id_doctor

Ну и дальше в том же духе smile ...

P.S. mi - это для минут, для секунд - ss, а для часов - hh.

Автор: Gudinya 18.10.2009, 18:07
Цитата(Gluttton @  18.10.2009,  17:53 Найти цитируемый пост)
помоему вложености лишние smile ...

В начале отрабатывает блок Where затем идет сортировка
т.е. у в твоем запросе выберется только сумма первой строки ;)

Автор: Gluttton 18.10.2009, 18:15
 smile 
Цитата(Gudinya @  18.10.2009,  18:07 Найти цитируемый пост)
В начале отрабатывает блок Where затем идет сортировкат.е. у в твоем запросе выберется только сумма первой строки ;)

Буду знать  smile ...
Но и сортировка в подзапросе не пройдет!

Автор: Gudinya 18.10.2009, 18:24
Цитата(Gluttton @  18.10.2009,  18:15 Найти цитируемый пост)
Но и сортировка в подзапросе не пройдет! 

где и что не отработает не понял
но все же если я не где не опечатался представленный запрос выберет врача с максимальным количеством времени честно честно ))
но  все это уже тоже smile 

Автор: madmasm 18.10.2009, 18:36
огромное СПАСИБО!!!!! Я можно так сказать постиг дзен за сегодня читая msdn)))) вот что получилось))
Код

SELECT     TOP (1) id_doctor, SUM(DATEPART(hh, okonchanie) - DATEPART(hh, nachalo)) AS rabota
FROM         rasp
GROUP BY id_doctor
ORDER BY rabota DESC
 хотел сначала с использованием row_number сделать но понял что нужно и отдохнуть за сегодня))) еще раз спасибо

Автор: Gluttton 18.10.2009, 18:48
 smile 
Цитата(madmasm @  18.10.2009,  18:36 Найти цитируемый пост)
огромное СПАСИБО!!!!!

Да собственно говоря и не зачто smile ...
Цитата(Gudinya @  18.10.2009,  18:24 Найти цитируемый пост)
где и что не отработает не понял

Учил SQL http://www.sql-ex.ru. Там запросы выполняются на SQL Server 2005, диалект SQL 92, так вот там запросы с сортировкой в подзапросе вызывают ошибку.
Т.е. вот такое не пройдет:
Код

select *
from
(
    select * from table
    order by field
)   as s

После твоего поста попробовал запрос с сортировкой в подзапросе у себя на Firebird 2.1 - прошел, для меня єто большое открытие smile ...
Цитата(Gudinya @  18.10.2009,  18:24 Найти цитируемый пост)
представленный запрос выберет врача с максимальным количеством времени честно честно ))

Теперь верю smile ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)