Минимальный список характеристик:
Создаем базу данных, три таблицы – сотрудники, работы и поручения. Таблица с поручениями является связующей между сотрудниками и списком работ. Вообще-то немного непонятно тут с этой трудоемкостью. Рассчитывается она как трудовые затраты на объем готовой продукции или выполненных работ. Примем объем работ за 1, тогда трудоемкость определится как затраты времени персонала. Будем считать, допустим, в человеко-днях и попытаемся привязаться к датам. Проект Гелиограф, я так понимаю, это не обработка деталей на станке и не покраска заборов, поэтому в количественном отношении подобную работу не высчитать. Как определить процент выполнения работы на определенную дату? Или заносить табель по дням, или оформлять документами количество выполненной работы. Упрощенно будем считать по календарным дням, без учета выходных.
Получилась такая схема:
- Шифр работы, название, трудоемкость, дата завершения;
- ФИО сотрудника, должность, табельный номер;
- Дата выдачи поручения на работу, трудоемкость, плановая и реальная даты окончания.
Одна и та же работа может выполняться несколькими сотрудниками и один и тот же сотрудник может участвовать в нескольких работах.
Выборки:
Выборки:
- Определить те работы в 2000 г., по которым плановые сроки выполнения превышают заданную дату завершения.
- Определить общее количество работ, находившихся на выполнении у некоторого сотрудника весной 1999 г.
- Определить те работы, которые к дате завершения были выполнены не более, чем на 50%.
- Определить должностной состав сотрудников, выполняющих работу 'проект Гелиограф'.
Получилась такая схема:
Если принять нашу упрощенную схему, то запросы сделать очень легко.
1. Выбираем работы, по которым плановые сроки превышают заданную дату завершения.
1. Выбираем работы, по которым плановые сроки превышают заданную дату завершения.
То есть, если у какого-то сотрудника запланированное (даже не реальное) окончание позже заданной даты, то такую работу отбираем. Делаем запрос с группировкой по работам, как условие ставим дату завершения – 2000 год и превышение плановой даты по сравнению с заданной датой. Можно добавить также записи с датой выдачи раньше 2000 года и датой завершения в 2000 или позже.
SELECT Работы.Название
FROM Работы INNER JOIN Поручения ON Работы.Шифр_работы = Поручения.Работа
WHERE (((Работы.Дата_завершения) Between #1/1/2000# And #12/31/2000#) AND ((Поручения.Плановая_дата)>[Работы]![Дата_завершения]))
GROUP BY Работы.Название;
2. Определим общее число работ на выполнении некоторого (да чего мелочиться, возьмем всех, а если нужен один определенный, то следует использовать отбор по фамилии или запрос с параметром) сотрудника.
Делаем запрос с группировкой, группируем работы по сотрудникам, считаем их количество. Для отбора нужных работ используем как условие следующий запрос (не поместился на картинке):
Делаем запрос с группировкой, группируем работы по сотрудникам, считаем их количество. Для отбора нужных работ используем как условие следующий запрос (не поместился на картинке):
([Поручения]![Дата_выдачи] Between #01.03.1999# And #31.05.1999#) Or ([Поручения]![Реальная_дата] Between #01.03.1999# And #31.05.1999#) Or (([Поручения]![Дата_выдачи]<#01.03.1999#) And ([Поручения]![Реальная_дата]>#31.05.1999#))
Вот такой запрос:
SELECT Сотрудники.ФИО, Count(Работы.Шифр_работы) AS [Count-Шифр_работы]
FROM Сотрудники INNER JOIN (Работы INNER JOIN Поручения ON Работы.Шифр_работы = Поручения.Работа) ON Сотрудники.Табельный_номер = Поручения.Сотрудник
WHERE (((([Поручения]![Дата_выдачи] Between #3/1/1999# And #5/31/1999#) Or ([Поручения]![Реальная_дата] Between #3/1/1999# And #5/31/1999#) Or (([Поручения]![Дата_выдачи]<#3/1/1999#) And ([Поручения]![Реальная_дата]>#5/31/1999#)))=Yes))
GROUP BY Сотрудники.ФИО;
3. Определяем должностной состав исполнителей проекта Гелиограф
Тут даже объяснять нечего
Тут даже объяснять нечего
SELECT Сотрудники.Должность, Count(Сотрудники.Табельный_номер) AS [Count-Табельный_номер]
FROM Сотрудники INNER JOIN (Работы INNER JOIN Поручения ON Работы.Шифр_работы = Поручения.Работа) ON Сотрудники.Табельный_номер = Поручения.Сотрудник
WHERE (((Работы.Название)="Проект Гелиограф"))
GROUP BY Сотрудники.Должность;
4. И, наконец, выбираем работы, которые к дате завершения готовы меньше, чем на 50%.
Будем считать отработанные сотрудниками дни (точнее, не отработанные, а календарные, мы ведь не заносили табель), суммировать их по работам (получим общие затраты в человеко-днях) и сравнивать их с трудоемкостью. Если полученный результат меньше половины заданной трудоемкости, значит, такую работу выводим в список.
Будем считать отработанные сотрудниками дни (точнее, не отработанные, а календарные, мы ведь не заносили табель), суммировать их по работам (получим общие затраты в человеко-днях) и сравнивать их с трудоемкостью. Если полученный результат меньше половины заданной трудоемкости, значит, такую работу выводим в список.
SELECT Работы.Название, Sum(DateDiff('d',[Поручения]![Дата_выдачи],[Работы]![Дата_завершения])) AS Дни, Работы.Трудоемкость
FROM Работы INNER JOIN Поручения ON Работы.Шифр_работы = Поручения.Работа
GROUP BY Работы.Название, Работы.Трудоемкость
HAVING (((Sum(DateDiff('d',[Поручения]![Дата_выдачи],[Работы]![Дата_завершения])))<[Работы]![Трудоемкость]/2));
В общем, я бы так сделал это задание, если бы не было каких-либо других уточнений. Но с трудоемкостью надо бы уточнить, конечно.
