Страницы

среда, 20 ноября 2013 г.

Запросы к базе данных Авторемонтные мастерские

Минимальный список характеристик:
  • Номер водительских прав, ФИО, адрес и телефон владельца автомобиля;
  • номер, ФИО, адрес, телефон и квалификация (разряд)  механика;
  • номер, марка, мощность, год выпуска и цвет автомобиля;
  • номер, название, адрес и телефон ремонтной мастерской;
  • стоимость наряда на ремонт, дата выдачи наряда, категория работ, плановая и реальная дата окончания ремонта.
Один и тот же автомобиль может обслуживаться разными автомеханиками и один и тот же автомеханик может обслуживать несколько автомобилей.
Выборки:
  • Выбрать фамилию того механика, который чаще всех работает с довоенными автомобилями.
  • Выбрать случаи, когда ремонт автомобилей марки 'Мерседес-600' задерживался относительно планового срока.
  • Определить тех владельцев автомобилей, которых всегда обслуживает один и тот же механик. Вывести фамилии механика и его постоянного клиента.
  • Для каждой категории работ определить, механик какого разряда чаще всего назначается на эту категорию работ
Создаем пять таблиц – владельцы, автомобили, автомеханики, мастерские, наряды. Мастерские для запросов не нужны, но в задании указаны, поэтому такую таблицу делать нужно. Примем, что автомеханик может работать в одной мастерской (чтобы не делать еще одну таблицу). Автомехаников и автомобили свяжем через таблицу Наряды. Получается такая схема:


1. Выбираем механика, который чаще, чем другие механики, обслуживает довоенные автомобили. Чаще, я так понимаю, это значит, что больше всех остальных во всей базе данных. Ну, иной период в задании не указан, значит, считаем всего.
В первом запросе с группировкой выбираем количество нарядов, по которым каждый механик ремонтировал довоенные автомобили.


SELECT Автомеханики.ФИО, Count(Наряды.Номер_наряда) AS [Count-Номер_наряда]
FROM Автомобили INNER JOIN (Автомеханики INNER JOIN Наряды ON Автомеханики.Номер_механика = Наряды.Автомеханик) ON Автомобили.Номер = Наряды.Автомобиль
WHERE (((Автомобили.[Год выпуска])<1941))
GROUP BY Автомеханики.ФИО;
Во втором запросе ищем максимальное число нарядов.


SELECT Max(Довоенный1.[Count-Номер_наряда]) AS [Max-Count-Номер_наряда]
FROM Довоенный1;
Третий запрос делаем на основе двух предыдущих. Выбираем того/тех механика/ов, который/ые ремонтировал/и довоенные автомобили максимальное количество раз.


SELECT Довоенный1.ФИО, Довоенный1.[Count-Номер_наряда]
FROM Довоенный1, Довоенный2
WHERE (((Довоенный1.[Count-Номер_наряда])=[Довоенный2]![Max-Count-Номер_наряда]));

2. Выявляем случаи просроченного ремонта шестисотых «Мерседесов».
Обойдемся одним запросом:


SELECT Автомобили.Марка, Наряды.Номер_наряда, Наряды.Дата_наряда, Автомеханики.ФИО, Наряды.Плановая_дата, Наряды.Реальная_дата
FROM Автомобили INNER JOIN (Автомеханики INNER JOIN Наряды ON Автомеханики.Номер_механика = Наряды.Автомеханик) ON Автомобили.Номер = Наряды.Автомобиль
WHERE (((Автомобили.Марка)="Мерседес-600") AND ((Наряды.Реальная_дата)>[Наряды]![Плановая_дата]));
3. Ищем механиков с постоянными клиентами. Точнее, клиентов с постоянными механиками.
В первом запросе выбираем владельцев, номер их прав и автомехаников. Все группируем.


SELECT Владельцы.ФИО, Автомеханики.ФИО, Владельцы.Номер_прав
FROM Владельцы INNER JOIN (Автомобили INNER JOIN (Автомеханики INNER JOIN Наряды ON Автомеханики.Номер_механика = Наряды.Автомеханик) ON Автомобили.Номер = Наряды.Автомобиль) ON Владельцы.Номер_прав = Автомобили.Владелец
GROUP BY Владельцы.ФИО, Автомеханики.ФИО, Владельцы.Номер_прав;
Второй запрос делаем на основе первого и считаем количество механиков на каждого клиента. Добавляем в выборку только те записи, в которых число механиков на 1 клиента равно 1.


SELECT Постоянный_механик1.Владельцы.ФИО, Count(Постоянный_механик1.Автомеханики.ФИО) AS [Count-Автомеханики_ФИО], Постоянный_механик1.Номер_прав
FROM Постоянный_механик1
GROUP BY Постоянный_механик1.Владельцы.ФИО, Постоянный_механик1.Номер_прав
HAVING (((Count(Постоянный_механик1.Автомеханики.ФИО))=1));
Третий запрос делаем из четырех таблиц и предыдущего запроса. Такая длинная цепочка получилась из-за того, что между владельцами и механиками две таблицы (автомобили и наряды).


SELECT Владельцы.ФИО, Автомеханики.ФИО
FROM (Владельцы INNER JOIN Постоянный2 ON Владельцы.Номер_прав = Постоянный2.Номер_прав) INNER JOIN (Автомобили INNER JOIN (Автомеханики INNER JOIN Наряды ON Автомеханики.Номер_механика = Наряды.Автомеханик) ON Автомобили.Номер = Наряды.Автомобиль) ON Владельцы.Номер_прав = Автомобили.Владелец
GROUP BY Владельцы.ФИО, Автомеханики.ФИО;

4. Для каждой категории работ нужно определить разряд исполнителей, которые чаще всего занимаются этой работой.
В первом запросе выбираем категории работ, разряды и число нарядов, выполненных каждым разрядом (точнее, обладателями каждого разряда). 


SELECT Наряды.Категория_работ, Автомеханики.Разряд, Count(Наряды.Номер_наряда) AS [Count-Номер_наряда]
FROM Автомеханики INNER JOIN Наряды ON Автомеханики.Номер_механика = Наряды.Автомеханик
GROUP BY Наряды.Категория_работ, Автомеханики.Разряд;
Второй запрос: выбираем записи с максимальным количеством нарядов по каждой категории.


SELECT Категория1.Категория_работ, Max(Категория1.[Count-Номер_наряда]) AS [Max-Count-Номер_наряда]
FROM Категория1
GROUP BY Категория1.Категория_работ;
Последний запрос делаем из первых двух, связав их по полю Категория. Выбираем те записи, число нарядов в которых равно максимальному числу выполненных работ (среди всех разрядов).


SELECT Категория1.Категория_работ, Категория1.Разряд, Категория1.[Count-Номер_наряда]
FROM Категория1 INNER JOIN Категория2 ON Категория1.Категория_работ = Категория2.Категория_работ
WHERE (((Категория1.[Count-Номер_наряда])=[Категория2]![Max-Count-Номер_наряда]));