Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на самого трудягу, помогите с запросом... 
:(
    Опции темы
madmasm
  Дата 18.10.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2009

Репутация: нет
Всего: нет



Помогите организовать запрос, факт в том что с SQL дело раньше не имел...
Есть таблица, то есть расписание работы врачей, организованная следующим образом :
user posted image
необходимо найти самого загруженного по расписанию врача(id_doctor), понятно что при нахождении такового необходимо будет использовать разницу и сложение времени и без таковой структуры не обойтись:

Код
 DATEPART (datepart , date  )


просто не могу понять как  правильно организовать запрос, нужна помощь, плиз...
PM MAIL   Вверх
Gluttton
Дата 18.10.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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


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


--------------------
Слава Україні!
PM MAIL   Вверх
madmasm
Дата 18.10.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2009

Репутация: нет
Всего: нет



СУБД - MS SQL Server 2005, я в ней на расчете общего количесва проработаных часов сотрудником и застрял((
PM MAIL   Вверх
Gudinya
Дата 18.10.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.2.2008

Репутация: 2
Всего: 8



ну если стили побоку то что то типа
Код

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

Это сообщение отредактировал(а) Gudinya - 18.10.2009, 17:46
PM MAIL ICQ   Вверх
Gluttton
Дата 18.10.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(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

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


--------------------
Слава Україні!
PM MAIL   Вверх
Gluttton
Дата 18.10.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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, вот тут можно посмотреть функции для работы с датами...
Оказывается в 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.

Это сообщение отредактировал(а) Gluttton - 18.10.2009, 18:25


--------------------
Слава Україні!
PM MAIL   Вверх
Gudinya
Дата 18.10.2009, 18:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.2.2008

Репутация: 2
Всего: 8



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

В начале отрабатывает блок Where затем идет сортировка
т.е. у в твоем запросе выберется только сумма первой строки ;)
PM MAIL ICQ   Вверх
Gluttton
Дата 18.10.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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

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


--------------------
Слава Україні!
PM MAIL   Вверх
Gudinya
Дата 18.10.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.2.2008

Репутация: 2
Всего: 8



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

где и что не отработает не понял
но все же если я не где не опечатался представленный запрос выберет врача с максимальным количеством времени честно честно ))
но  все это уже тоже smile 
PM MAIL ICQ   Вверх
madmasm
Дата 18.10.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2009

Репутация: нет
Всего: нет



огромное СПАСИБО!!!!! Я можно так сказать постиг дзен за сегодня читая 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 сделать но понял что нужно и отдохнуть за сегодня))) еще раз спасибо
PM MAIL   Вверх
Gluttton
Дата 18.10.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



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

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

Учил SQL вот на этом ресурсе. Там запросы выполняются на 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 ...



--------------------
Слава Україні!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.