Страницы

суббота, 30 ноября 2013 г.

Запросы к базе данных Телефонная станция

Минимальный список характеристик:
  • Номер абонента, фамилия абонента, адрес, наличие блокиратора,  примечание;
  • Код АТС, код района, количество номеров;
  • Номер спаренного телефона абонента, задолженность, дата установки.
Один спаренный номер одной АТС может использоваться несколькими абонентами и один и тот же абонент может использовать телефоны разных АТС.
Выборки:
  1. Выбрать пары сблокированных телефонов.
  2. Определить АТС, районы действия которых перекрываются.
  3. Выбрать телефоны группового пользования, Вывести их номера и фамилии абонентов.
  4. Выбрать список абонентов АТС 47, имеющих задолженность больше 100 руб.
Создаем таблицы «Абоненты», «АТС» и «Номера». В таблице «АТС» поле «Код» - это код АТС. Оно ключевое, в данном случае принято, что одна АТС работает только в одном районе. Если же действие АТС распространяется на несколько районов, то таблицу «АТС» делим на две части, в одной список АТС, в другой – АТС и районы.


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


SELECT Номера.Номер_телефона, Count(Номера.Абонент) AS [Count-Абонент]
FROM Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент
WHERE (((Абоненты.Блокиратор)=Yes))
GROUP BY Номера.Номер_телефона
HAVING (((Count(Номера.Абонент))>1));
2. Определить АТС, которые действуют в одном районе.
Делаем запрос с группировкой по районам. Считаем, сколько АТС приходится на каждый район, если больше одной, то выбираем. 


SELECT АТС.[Код района], Count(АТС.Код) AS [Count-Код]
FROM АТС
GROUP BY АТС.[Код района]
HAVING (((Count(АТС.Код))>1));
В следующем запросе выбираем сами АТС. Создаем запрос из таблицы «АТС» и предыдущего запроса. Будем выбирать те записи, код района в которых равен коду района из запроса. И у нас получается список АТС с кодами районов.


SELECT АТС.Код, АТС.[Код района]
FROM АТС RIGHT JOIN АТС1 ON АТС.[Код района] = АТС1.[Код района]
WHERE (((АТС.[Код района])=[АТС1]![Код района]));
3. Выбрать номера и фамилии абонентов с телефонами группового пользования.
Это задание похоже на первое, но осложняется выбором ФИО. Поэтому сделаем его из двух запросов. В первом отберем записи с номерами групповых телефонов (число абонентов на один номер больше единицы).


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


SELECT Номера.Номер_телефона, Абоненты.ФИО
FROM Группа1, Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент
WHERE (((Номера.Номер_телефона)=[Группа1]![Номер_телефона]));
4. Список должников АТС 47
Это простой запрос на выборку. Как условие указываем задолженность больше 100 руб. и код АТС, равный 47.


SELECT Абоненты.ФИО, Номера.Задолженность
FROM АТС INNER JOIN (Абоненты INNER JOIN Номера ON Абоненты.Номер_абонента = Номера.Абонент) ON АТС.Код = Номера.АТС
WHERE (((Номера.Задолженность)>100) AND ((АТС.Код)=47));
Это был последний вариант в данной контрольной работе. Я видел и другие версии (с тридцатью вариантами), но задания (на первый взгляд) похожи на те, что я тут выложил, поэтому можно посмотреть что-то похожее и решить по аналогии. Или пишите в комментах, выложу вариант, какой нужно.
Всем удачи в решении!))