Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прокат автомобилей.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
18.5 Mб
Скачать
  1. Пользовательские функции

--Функция подсчитывает доходод

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