Страницы

понедельник, 18 ноября 2013 г.

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

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


1. Определяем самого молодого владельца магазина, находящегося в районе «Киевский».
В первом запросе делаем группировку, нам нужно выбрать ФИО, дату рождения и сделать отбор по Киевскому району. 


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-Дата_рождения]));
2. Выбираем случаи регистрации несовершеннолетних владельцев
Выбираем все записи и считаем разность между двумя датами (с помощью функции DateDifff) – датой регистрации и датой рождения:


SELECT Владение.Номер_регистрации, Владение.Дата_регистрации, Владельцы.ФИО, DateDiff('yyyy',[Владельцы]![Дата_рождения],[Владение]![Дата_регистрации]) AS Возраст, Магазины.Название
FROM Магазины INNER JOIN (Владельцы INNER JOIN Владение ON Владельцы.Номер_владельца = Владение.Владелец) ON Магазины.Номер_магазина = Владение.Магазин
WHERE (((DateDiff('yyyy',[Владельцы]![Дата_рождения],[Владение]![Дата_регистрации]))<18));
3. Определяем владельцев, внесших более половины уставного капитала магазина. При этом они должны проживать (быть зарегистрированными) в другом районе. Несмотря на длинную формулировку, сам запрос довольно простой. Выбираем владельцев, магазины, районы проживания и регистрации, считаем по формуле процент от уставного капитала. Как условие, ставим процент больше 50 и несовпадение районов:


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


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