1.2 Создание запросов
Подготовим SQL-скрипт для создания хранимых процедур, которые будут выполнять запросы, описанные в техническом задании:
Получить перечень и общее число организаций, которым выделены номера либо с указанной серией, либо за указанный период.
SELECT Organisations.Name, Organisations.Arial, Organisations.Addres, Organisations.Manager
FROM Serial, Numbers, PTS, Users, Organisations, PTS_users
WHERE Serial.ID = Numbers.SerialID
and Numbers.ID = PTS.NumberID
and PTS.ID = PTS_users.PTS_ID
and PTS_users.UserID = Users.ID
and Users.Organisation = Organisations.ID
and Serial.Name = 'CTO'
SELECT COUNT (Organisations.Name) as [Общее число организаций]
FROM Serial, Numbers, PTS, Users, Organisations, PTS_users
WHERE Serial.ID = Numbers.SerialID
and Numbers.ID = PTS.NumberID
and PTS.ID = PTS_users.PTS_ID
and PTS_users.UserID = Users.ID
and Users.Organisation = Organisations.ID
and Serial.Name = 'CTO'
SELECT Organisations.Name, Organisations.Arial, Organisations.Addres, Organisations.Manager
FROM Serial, Numbers, PTS, Users, Organisations, PTS_users
WHERE Serial.ID = Numbers.SerialID
and Numbers.ID = PTS.NumberID
and PTS.ID = PTS_users.PTS_ID
and PTS_users.UserID = Users.ID
and Users.Organisation = Organisations.ID
and Numbers.[Date] BETWEEN '07.10.2007' AND '14.08.2013'
Результат выполнения запроса:
Рисунок 1.19 Пример выполнения запроса
Получить сведения о владельце автотранспортного средства по государственному номеру автомашины.
SELECT Users.Second_name, Users.First_name, Users.Father_name, Users.Birthdate
FROM Numbers, PTS, USERS, PTS_users
WHERE Numbers.ID = PTS.NumberID
and PTS.ID = PTS_users.PTS_ID
and PTS_users.UserID = Users.ID
and Users.Organisation is NULL
and Numbers.Number = '125'
SELECT Users.Second_name, Users.First_name, Users.Father_name, Users.Birthdate, Organisations.Name, Organisations.Addres, Organisations.Arial, Organisations.Manager
FROM Numbers, PTS, USERS, PTS_users, Organisations
WHERE Numbers.ID = PTS.NumberID
and PTS.ID = PTS_users.PTS_ID
and PTS_users.UserID = Users.ID
and Users.Organisation = Organisations.ID
and Numbers.Number = '323'
Результат выполнения запроса:
Рисунок 1.20 Пример выполнения запроса
Получить "досье" на автомобиль по государственному номеру - номера двигателя, кузова и шасси, участвовал ли в ДТП, прошел ли техосмотр.
SELECT PTS.Firm , PTS.Engine_number, PTS.Chassis_number, PTS.Stand_number, DTP.Data as [Дата аварии], [To].Passed as [Техосмотр]
FROM Numbers, PTS, Number_DTP, DTP, [To]
WHERE Numbers.ID = PTS.NumberID
and Number_DTP.PtsID = PTS.ID
and DTP.ID = Number_DTP.DTP_ID
and Numbers.ID = Pts.NumberID
and Numbers.Number = '72'
and [To].PTS_ID = PTS.ID
Результат выполнения запроса:
Рисунок 1.21 Пример выполнения запроса
Получить перечень и общее число владельцев машин, не прошедших вовремя техосмотр.
SELECT Users.Second_name, Users.First_name, Users.Father_name, Users.Birthdate
FROM [TO], PTS, Users, PTS_users
WHERE Users.ID = PTS_users.UserID
and PTS_users.PTS_ID = PTS.ID
and [TO].PTS_ID = PTS.ID
and [TO].Passed = 'false'
SELECT COUNT (Users.Second_name) as [Общее число владельцев]
FROM [TO], PTS, Users, PTS_users
WHERE Users.ID = PTS_users.UserID
and PTS_users.PTS_ID = PTS.ID
and [TO].PTS_ID = PTS.ID
and [TO].Passed = 'false'
Результат выполнения запроса:
Рисунок 1.22 Пример выполнения запроса
Получить статистику по любому типу ДТП за указанный период.
SELECT COUNT(DTP.ID) as [Количество ДТП], COUNT(Number_DTP.PtsID)
as [Количество участников], COUNT(Number_DTP.Leave) as[Количество пострадавших]
FROM DTP, DTP_Types, Number_DTP
WHERE DTP_Types.Name = 'Наезд на велосипедиста'
and DTP.[Type] = DTP_Types.ID
and DTP.ID = Number_DTP.DTP_ID
and DTP.Data BETWEEN '06.07.2013' and '02.10.2015'
Результат выполнения запроса:
Рисунок 1.23 Пример выполнения запроса
Получить результаты анализа ДТП: самые опасные места в городе, самая частая причина ДТП
SELECT TOP 5 ДТП.Name, Количество
FROM ( SELECT count(DTP.ReasonID) AS Количество, Reason_DTP.Name
FROM Reason_DTP, DTP
WHERE Reason_DTP.ID = DTP.ReasonID
GROUP BY Reason_DTP.Name) AS ДТП
ORDER BY Количество desc
SELECT TOP 5 ДТП.Name, Количество
FROM ( SELECT count(DTP.StreetID) AS Количество, Streets.Name
FROM Streets, DTP
WHERE Streets.ID = DTP.StreetID
GROUP BY Streets.Name) AS ДТП
ORDER BY Количество desc
Результат выполнения запроса:
Рисунок 1.24 Пример выполнения запроса
Получить данные о количестве ДТП, совершаемых водителями в нетрезвом виде и доля таких происшествий в общем количестве ДТП.
SELECT B_DTP.[Количество проишествий], A_DTP.[Количество проишествий по причине], A_DTP.[Количество проишествий по причине]*100/B_DTP.[Количество проишествий] as [Доля проишествий(%)]
FROM (SELECT COUNT(DTP.ID) as [Количество проишествий по причине] FROM DTP, Reason_DTP WHERE DTP.ReasonID = Reason_DTP.ID and Reason_DTP.ID = '2') AS A_DTP,
(SELECT COUNT(DTP.ID) as [Количество проишествий] FROM DTP, Reason_DTP WHERE DTP.ReasonID = Reason_DTP.ID) AS B_DTP
Результат выполнения запроса:
Рисунок 1.25 Пример выполнения запроса
Получить список машин, отданных в розыск, будь то скрывшиеся с места ДТП или угнанные.
SELECT PTS_type.name as [Type] ,PTS.Firm, PTS.Color, Numbers.Number, Serial.Name as [Serial], Regions.Name as [Region], PTS.Engine_number, PTS.Engine_number, PTS.Stand_number, Stealing.[Date] as [Stealing date], Reasosns.Name as [Причина]
FROM Stealing, PTS, Numbers, Regions, PTS_type, Serial, Reasosns
WHERE Stealing.PTS_ID = PTS.ID
and PTS.NumberID = Numbers.ID
and Serial.ID = Numbers.SerialID
and Regions.ID = Numbers.RegionID
and PTS_type.id = PTS.[Type]
and Stealing.ReasonID = Reasosns.ID
and Stealing.Found = 'false'
Результат
выполнения запроса:
Рисунок 1.26 Пример выполнения запроса
Получить данные об эффективности розыскной работы: количество найденных машин в процентном отношении.
SELECT steel_table.steel as [Найденные автомобили], nsteel_table.nsteel as [Общее количество], steel_table.steel*100/nsteel_table.nsteel as[Процент найденных]
FROM (SELECT COUNT(Stealing.ID) as steel FROM Stealing WHERE Stealing.Found = 'true' ) as steel_table,
(SELECT COUNT(Stealing.ID) as nsteel FROM Stealing) as nsteel_table
Результат выполнения запроса:
Рисунок 1.27 Пример выполнения запроса
Получить перечень и общее число угонов за указанный период.
SELECT PTS.Firm, PTS.Color, Numbers.Number, Serial.Name, Stealing.[Date], Stealing.Citi, Stealing.Street
FROM Stealing, PTS, Numbers, Serial, Reasosns
WHERE Serial.ID = Numbers.SerialID
and Numbers.ID = PTS.NumberID
and PTS.ID = Stealing.PTS_ID
and Reasosns.ID = '2'
and Stealing.[Date] BETWEEN '03.09.2013'AND'21.12.2015'
Результат выполнения запроса:
Рисунок 2.28 Пример выполнения запроса
Получить статистику по угонам: самые угоняемые марки машин, самые надежные сигнализации и т.п.
SELECT TOP 5 Угон.Firm, Количество
FROM ( SELECT COUNT(PTS.ID) AS количество , PTS.Firm
FROM PTS, Stealing
WHERE Stealing.PTS_ID = PTS.ID
and Stealing.ReasonID = '2'
GROUP BY PTS.Firm) as Угон
ORDER BY Количество desc
SELECT TOP 5 Сигнализация.Name, Количество
FROM ( SELECT COUNT(PTS.ID) AS количество , Signalling.Name
FROM PTS, Stealing, Signalling
WHERE Stealing.PTS_ID = PTS.ID
and Signalling.ID = PTS.SignallingID
and Stealing.ReasonID = '2'
GROUP BY Signalling.Name) as Сигнализация
ORDER BY Количество desc
Результат выполнения запроса:
Рисунок 1.29 Пример выполнения запроса
