- •Прокат автомобилей
- •Анализ предметной области
- •Описание предметной области.
- •Основные бизнес процессы
- •Реляционная модель базы данных
- •Заполнение таблиц данными
- •Запросы
- •Настройка безопасности
- •Создание Backup
- •1 Способ
- •2 Способ
- •Представления
- •Пользовательские функции
- •Курсоры
- •Триггеры
- •Процедуры
Пользовательские функции
--Функция подсчитывает доходод
DROP FUNCTION ComputationProfit
GO
CREATE FUNCTION ComputationProfit
(@Count int, @Price int)
RETURNS numeric(10,2)
BEGIN
RETURN @Price*@Count
END
GO
--Доход с каждого автомобиля, при 10 прокатов
SELECT ca.car_number as 'Номер авто',
dbo.ComputationProfit(10, ca.price_rub_day) as 'Стоимость 10 прокатов'
FROM [car_rental].[dbo].[car] as ca
GO
-- Текущий доход с каждого австомобиля
SELECT c.car_number
,COUNT(c.car_number) as 'Количество договоров'
,dbo.ComputationProfit(COUNT(c.car_number), ca.price_rub_day) as 'Доход с прокатов'
FROM [car_rental].[dbo].[contract] as c
,[car_rental].[dbo].[car] as ca
WHERE c.car_number = ca.car_number
GROUP BY c.car_number, ca.price_rub_day
GO
--Функция показывает автомобили с прибылью больше X р.
DROP FUNCTION ProfitCar
GO
CREATE FUNCTION ProfitCar
(@total int)
RETURNS @profit_car TABLE
(car_number varchar(9) primary key
,count_contract int
,total_car_price numeric(10,2))
AS
BEGIN
INSERT @profit_car
SELECT c.car_number
,COUNT(c.car_number)
,dbo.ComputationProfit(COUNT(c.car_number), ca.price_rub_day)
FROM [car_rental].[dbo].[contract] as c
,[car_rental].[dbo].[car] as ca
WHERE c.car_number = ca.car_number
GROUP BY c.car_number, ca.price_rub_day
HAVING dbo.ComputationProfit(COUNT(c.car_number), ca.price_rub_day) >= @total
RETURN
END
GO
--Автомобили с доходом свыше 2000р.
SELECT *
FROM ProfitCar(2000)
GO
--Функция для рассчета прибыли с автомобилей(я) за все время
drop function CountingProfitAuto
go
create function CountingProfitAuto
(@nubmer varchar (15) = null)
returns int
begin
declare @sum int
declare @sum1 int
declare @sum2 int
select @sum1 = SUM(r.amount_maintenance)
from report as r
where 1=case when not @nubmer is Null then
case when r.car_number=@nubmer
then 1
else 0
end
else 1
end
if not @nubmer is Null
begin
select @sum2 = SUM(p.amount)
from car as c
inner join contract as contr
on c.car_number=contr.car_number
inner join payment as p
on p.contract_number=contr.contract_number
where c.car_number=@nubmer
end
else
select @sum2 = SUM(p.amount)
from car as c
inner join contract as contr
on c.car_number=contr.car_number
inner join payment as p
on p.contract_number=contr.contract_number
set @sum = @sum2-@sum1
return @sum
end
go
--Прибыль с автомобиля имеющим номер 'С154АУ154'
select c.car_number as 'Номер автомобиля'
,c.date_of_last_TO as 'Дата последнего ТО'
,dbo.CountingProfitAuto(c.car_number) as 'Доход за все время'
from car as c
where c.car_number = 'С154АУ154'
--Прибыль с автомобилей
select c.car_number as 'Номер автомобиля'
,c.date_of_last_TO as 'Дата последнего ТО'
,dbo.CountingProfitAuto(c.car_number) as 'Доход за все время'
from car as c
--Функция для рассчета прибыли с автомобилей(я) в текущем месяце
DROP FUNCTION IncomeFromCarAMonth
GO
CREATE FUNCTION IncomeFromCarAMonth
(@car_number varchar(9) = null)
RETURNS numeric(10,2)
BEGIN
declare @count int
declare @price int
if not @car_number is Null
begin
SELECT @count = DATEDIFF(day, contr.date_of_payment, contr.date_of_end)
,@price=c.price_rub_day
FROM [dbo].[contract] as contr
INNER JOIN [dbo].[car] as c
on contr.car_number=c.car_number
WHERE contr.car_number = @car_number and MONTH(contr.date_of_end) = MONTH(GETDATE())
END
else
SELECT @count = DATEDIFF(day, contr.date_of_payment, contr.date_of_end)
,@price=c.price_rub_day
FROM [dbo].[contract] as contr
INNER JOIN [dbo].[car] as c
on contr.car_number=c.car_number
WHERE MONTH(contr.date_of_end) = MONTH(GETDATE())
RETURN dbo.ComputationProfit(@count,@price)
END
GO
--Прибыль с автомобиля имеющим номер 'С154АУ154' в текущем месяце
select c.car_number as 'Номер автомобиля'
,c.date_of_last_TO as 'Дата последнего ТО'
,dbo.IncomeFromCarAMonth(c.car_number) as 'Доход за текущий месяц'
from car as c
where c.car_number = 'С154АУ154'
--Прибыль с автомобилей в текущем месяце
select c.car_number as 'Номер автомобиля'
,c.date_of_last_TO as 'Дата последнего ТО'
,dbo.IncomeFromCarAMonth(c.car_number) as 'Доход за текущий месяц'
from car as c
--Функция для рассчета принесенной прибыли менеджером
DROP FUNCTION SuccessEmployee
GO
CREATE FUNCTION SuccessEmployee
(@id_employee int)
RETURNS @SuccessEmployee TABLE
(id_employee int primary key
,name_employee varchar(50)
,count_contract int
,total_amount numeric(10,2))
AS
BEGIN
declare @name_employee varchar(50)
declare @count_contract int
declare @total_amount numeric(10,2)
if not @id_employee is Null
begin
SELECT
@name_employee= e.name
,@count_contract = COUNT(*)
,@total_amount= SUM(dbo.CountingProfitAuto(c.car_number))
FROM
[car_rental].[dbo].[contract] as cont
INNER JOIN [car_rental].[dbo].car as c
on cont.car_number=c.car_number
INNER JOIN [car_rental].[dbo].[employee] as e
on cont.employee_id=e.employee_id
WHERE e.employee_id=@id_employee
GROUP BY
e.name,
cont.employee_id
END
insert into @SuccessEmployee(id_employee,name_employee,count_contract,total_amount)
Values
(@id_employee,@name_employee,@count_contract,@total_amount)
RETURN
END
GO
--Доход принесенный менеджером с ID=1
SELECT s.id_employee as 'ID работника'
,s.name_employee as 'ФИО'
,s.count_contract as 'Кол-во оформленных договоров'
,s.total_amount as 'Принесенная прибыль'
FROM SuccessEmployee(1) as s
GO
