RevenueComparationCCM.sql

193 lines | 5.272 kB Blame History Raw Download

set noexec off
go
if object_id('RevenueComparationCCM') is not null
begin
	set noexec on
end	
go
-- создаем пустой объект
-- необходимо указать название процедуры
create procedure dbo.RevenueComparationCCM as
raiserror ('Объект пустой. Ошибка при создаении объекта', -- Message text.
				16, -- Severity.
				1 -- State.
			);
go
set noexec off
go
alter procedure dbo.RevenueComparationCCM
(
	 @CompaniesList varchar(max),
	 @ActualPeriodDateFrom DateTime = null,
	 @ActualPeriodDateTo DateTime = null,
	 @LastPeriodDateFrom DateTime = null,
	 @LastPeriodDateTo DateTime = null
) 
as 

begin

--declare @CompaniesList varchar(max)
--declare @ActualPeriodDateFrom DateTime
--declare @ActualPeriodDateTo DateTime
--declare @LastPeriodDateFrom DateTime
--declare @LastPeriodDateTo DateTime

--Set @CompaniesList = '1'
--Set @ActualPeriodDateFrom = convert(DateTime, '21.01.2020', 104)
--Set @ActualPeriodDateTo = convert(DateTime, '21.01.2020', 104)
--Set @LastPeriodDateFrom = convert(DateTime, '14.01.2020', 104)
--Set @LastPeriodDateTo = convert(DateTime, '14.01.2020', 104)

	
	declare @ActualPeriodDateFromInt DateTime
	declare @ActualPeriodDateToInt DateTime
	declare @LastPeriodDateFromInt DateTime
	declare @LastPeriodDateToInt DateTime

	Set @ActualPeriodDateFromInt = cast(@ActualPeriodDateFrom as Date)
	Set @LastPeriodDateFromInt = cast(@LastPeriodDateFrom as Date)
	Set @ActualPeriodDateToInt = cast(@ActualPeriodDateTo as Date)
	Set @LastPeriodDateToInt = cast(@LastPeriodDateTo as Date)

	Set @ActualPeriodDateToInt = dateadd(ms, -2, dateadd(day, 1, @ActualPeriodDateToInt)) 
	Set @LastPeriodDateToInt = dateadd(ms, -2, dateadd(day, 1, @LastPeriodDateToInt))

	
	declare @TerminalsList table (TerminalID nvarchar(256), ShopID int)

	insert into @TerminalsList
		select
			t.Id as TerminalID,
			t.ShopID as ShopID

		from dbo.Shops s with (nolock)
			inner join dbo.Terminals t with (nolock) on
				t.ShopId = s.Id
		where
			s.CompanyId in
				(
					select
						Convert(int, Value)
					from STRING_SPLIT(@CompaniesList, ',')
				)
		and t.HostName <> ''
		
	declare @SessionList table (
			ShopId int,
			TerminalId nvarchar(256),
			SessionId bigint,
			CashCredit decimal (15,2),
			BankcardCredit decimal (15,2),
			MobileAppCredit decimal (15,2),
			LastPeriod tinyint

			INDEX IX_SessionList_ShopId NONCLUSTERED (ShopId),
			INDEX IX_SessionList_LastPeriod NONCLUSTERED (LastPeriod)
		)

	insert into @SessionList
		select
			tl.ShopID,
			ss.TerminalId,
			ss.SessionId,
			cast(ss.CashCredit as decimal (15,2)) / 100 as CashCredit,
			cast(ss.BankcardCredit as decimal (15,2)) / 100 as BankcardCredit,
			cast(ss.MobileAppCredit as decimal (15,2)) / 100 as MobileAppCredit,
			
			case 
				when ss.CloseTime between @LastPeriodDateFromInt and @LastPeriodDateToInt then 1
				else 0
			end as LastPeriod 
			
		from @TerminalsList tl
			inner join dbo.Sessions ss with (nolock) on
					(
							ss.CloseTime between @ActualPeriodDateFromInt and @ActualPeriodDateToInt
						or	ss.CloseTime between @LastPeriodDateFromInt and @LastPeriodDateToInt
					)
				and ss.TerminalId = tl.TerminalID
				and (ss.Flags & 2) = 0 -- Отсекаем отменённые сессии

	
		
	declare @SessionTotals table (
			ShopId int,
			CashCreditLastPeriod decimal (15,2),
			BankcardCreditLastPeriod decimal (15,2),
			MobileAppCreditLastPeriod decimal (15,2),
			CashCredit decimal (15,2),
			BankcardCredit decimal (15,2),
			MobileAppCredit decimal (15,2)

			INDEX IX_SessionTotals_ShopId NONCLUSTERED (ShopId)
		)

	insert into @SessionTotals	
		select
			t.ShopId,
			sum(t.CashCreditLastPeriod),
			sum(t.BankcardCreditLastPeriod),
			sum(t.MobileAppCreditLastPeriod),
			sum(t.CashCredit),
			sum(t.BankcardCredit),
			sum(t.MobileAppCredit)

		from(
			select
				sl.ShopId,
				0 as CashCreditLastPeriod,
				0 as BankcardCreditLastPeriod,
				0 as MobileAppCreditLastPeriod,
				sum(sl.CashCredit) as CashCredit,
				sum(sl.BankcardCredit) as BankcardCredit,
				sum(sl.MobileAppCredit) as MobileAppCredit
		
			from @SessionList sl
			where
				sl.LastPeriod = 0
			
			group by sl.ShopId

			union all
			
			select
				sl.ShopId,
				sum(sl.CashCredit) as CashCreditLastPeriod,
				sum(sl.BankcardCredit) as BankcardCreditLastPeriod,
				sum(sl.MobileAppCredit) as MobileAppCreditLastPeriod,
				0 as CashCredit,
				0 as BankcardCredit,
				0 as MobileAppCredit
		
			from @SessionList sl
			where
				sl.LastPeriod = 1
			
			group by sl.ShopId
			
			) as t
		group by t.ShopId
		

	select 
		tl.ShopID as ShopID,
		s.Name,
		isnull(SessionTotals.CashCreditLastPeriod, 0) as CashCreditLastPeriod,
		isnull(SessionTotals.BankcardCreditLastPeriod, 0) as BankcardCreditLastPeriod,
		isnull(SessionTotals.MobileAppCreditLastPeriod, 0) as MobileAppCreditLastPeriod,				
		isnull(SessionTotals.CashCredit, 0) as CashCredit,
		isnull(SessionTotals.BankcardCredit, 0) as BankcardCredit,
		isnull(SessionTotals.MobileAppCredit, 0) as MobileAppCredit,
		
		isnull(SessionTotals.CashCredit, 0) + isnull(SessionTotals.BankcardCredit, 0) + isnull(SessionTotals.MobileAppCredit, 0)
			- isnull(SessionTotals.CashCreditLastPeriod, 0) - isnull(SessionTotals.BankcardCreditLastPeriod, 0) - isnull(SessionTotals.MobileAppCreditLastPeriod, 0) as Delta

	from @TerminalsList tl
		inner join dbo.Shops s on s.Id = tl.ShopID
		left join @SessionTotals SessionTotals on SessionTotals.ShopID = tl.ShopID
end

go