Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технологии_Баз_Данных_2020.docx
Скачиваний:
274
Добавлен:
01.07.2020
Размер:
1.01 Mб
Скачать

5. Сеть магазинов

Минимальный список характеристик:

  • Номер, ФИО, адрес, телефон владельца магазина, размер вклада в магазин, номер регистрации, дата регистрации;

  • номер, название, адрес и телефон магазина, уставной капитал, профиль;

  • номер, ФИО, адрес, телефон поставщика, а также стоимость поставки данного поставщика в данный магазин.

Один и тот же магазин может иметь несколько владельцев и один и тот же владелец может иметь в собственности много магазинов.

Примечание: профиль - продуктовый, галантерейный, канцелярский и т.п.

Выборки:

  • Определить самого молодого предпринимателя, владеющего собственностью в районе 'Киевский'.

SELECT Магазины.Район, Владельцы.ФИО, Владельцы.Дата_рождения, Count(Магазины.Номер_магазина) AS [Count-Номер_магазина] FROM Магазины INNER JOIN (Владельцы INNER JOIN Владение ON Владельцы.Номер_владельца = Владение.Владелец) ON Магазины.Номер_магазина = Владение.Магазин GROUP BY Магазины.Район, Владельцы.ФИО, Владельцы.Дата_рождения HAVING (((Магазины.Район)="Киевский"));

Затем выбираем запись с максимальной датой

SELECT Max(Молодой1.[Min-Дата_рождения]) AS [Max-Min-Дата_рождения] FROM Молодой1;

И в последнем запросе выбираем тех владельцев, чья дата рождения совпадает с максимальной.

SELECT Молодой1.ФИО FROM Молодой1, Молодой2 WHERE (((Молодой1.[Min-Дата_рождения])=[Молодой2]![Max-Min-Дата_рождения]));

  • Определить случаи, когда регистрировалось владение лицами, не достигшими 18 лет.

SELECT Владение.Номер_регистрации, Владение.Дата_регистрации, Владельцы.ФИО, DateDiff('yyyy',[Владельцы]![Дата_рождения],[Владение]![Дата_регистрации]) AS Возраст, Магазины.Название FROM Магазины INNER JOIN (Владельцы INNER JOIN Владение ON Владельцы.Номер_владельца = Владение.Владелец) ON Магазины.Номер_магазина = Владение.Магазин WHERE (((DateDiff('yyyy',[Владельцы]![Дата_рождения],[Владение]![Дата_регистрации]))<18));

  • Определить случаи, когда больше 50% уставного капитала магазина внесено предпринимателем, проживающим в другом районе.

SELECT Владельцы.ФИО, Владельцы.Район, Магазины.Название, Магазины.Район, [Владение]![Размер вклада]*100/[Магазины]![Уставной_капитал] AS Процент FROM Магазины INNER JOIN (Владельцы INNER JOIN Владение ON Владельцы.Номер_владельца = Владение.Владелец) ON Магазины.Номер_магазина = Владение.Магазин WHERE (((Магазины.Район)<>[Владельцы]![Район]) AND (([Владение]![Размер вклада]*100/[Магазины]![Уставной_капитал])>50));

  • Вывести список профилей магазинов, которыми владеет предприниматель 'Кузнецов' в порядке убывания вложенного в них капитала

SELECT Магазины.Профиль, Владельцы.ФИО, Sum(Владение.[Размер вклада]) AS [Sum-Размер вклада] FROM Магазины INNER JOIN (Владельцы INNER JOIN Владение ON Владельцы.Номер_владельца = Владение.Владелец) ON Магазины.Номер_магазина = Владение.Магазин GROUP BY Магазины.Профиль, Владельцы.ФИО HAVING (((Владельцы.ФИО)="Кузнецов")) ORDER BY Sum(Владение.[Размер вклада]) DESC;

6. Авторемонтные мастерские

Минимальный список характеристик:

  • Номер водительских прав, ФИО, адрес и телефон владельца автомобиля;

  • номер, ФИО, адрес, телефон и квалификация (разряд) механика;

  • номер, марка, мощность, год выпуска и цвет автомобиля;

  • номер, название, адрес и телефон ремонтной мастерской;

  • стоимость наряда на ремонт, дата выдачи наряда, категория работ, плановая и реальная дата окончания ремонта.

Один и тот же автомобиль может обслуживаться разными автомеханиками и один и тот же автомеханик может обслуживать несколько автомобилей.

Выборки:

  • Выбрать фамилию того механика, который чаще всех работает с довоенными автомобилями.

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

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-Номер_наряда]));

  • Выбрать случаи, когда ремонт автомобилей марки 'Мерседес-600' задерживался относительно планового срока.

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

  • Определить тех владельцев автомобилей, которых всегда обслуживает один и тот же механик. Вывести фамилии механика и его постоянного клиента.

В первом запросе выбираем владельцев, номер их прав и автомехаников. Все группируем.

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 Владельцы.ФИО, Автомеханики.ФИО;

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

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-Номер_наряда]));