Очень полезно бывает знать как изменился показатель по отношению тому же месяцу или кварталу за прошлый год.
Для эого используем показать год к году - YOY.
Его формула
Как технически это вывести в отчете по периодам?
При вычислении дат начала и конца периода для недель, месяцев и кварталов дополнительно вычисляем даты аналогичного периода, но за прошлый год (@yoydate и @yoydate2):
declare @yoyDate date, @yoyDate2 date
while (@date< getdate() ) begin
set @yoyDate= NULL
set @yoyDate2= NULL
set @date2= dateadd(day, 1, @date)
set @name = convert(nvarchar, @date, 104)
if(@filterIntervalType='weeks') begin
set @date2= dateadd(week, 1, @date)
set @name = 'Week '+ cast(datepart(week, @date) as nvarchar);
end
if(@filterIntervalType='months') begin
set @date2= dateadd(month, 1, @date)
set @name =FORMAT(@date, 'MMMM', 'ru-ru') + ' ' + cast(datepart(year, @date) as nvarchar);
end
if(@filterIntervalType='quarters') begin
set @date2= dateadd(quarter, 1, @date)
set @name =datename(quarter, @date) + ' ' + cast(datepart(year, @date) as nvarchar);
end
set @yoyDate= dateadd(year, -1, @date)
set @yoyDate2= dateadd(year, -1, @date2)
if(@filterIntervalType='years') begin
set @date2= dateadd(year, 1, @date)
set @name = cast(datepart(year, @date) as nvarchar);
end
.....
end
Далее при вычислении показателя, мы вычисляем показатель за период и показатель за предыдущий период:
select
isnull( (select cast(sum(isnull(valueFloat, 0)) as nvarchar) from [as_mt_outerValues]
where code='falcon-visitors' and itemID='d'
and date >= @date and date < @date2), 0) falcon_visits,
isnull( (select cast(sum(isnull(valueFloat, 0)) as nvarchar) from [as_mt_outerValues]
where code='falcon-visitors' and itemID='d'
and date >= @yoyDate and date < @yoyDate2), 0) falcon_visitsPrev
.....
В итоге в таблице выводим прирост показателя через функцию с разметкой:
-- SELECT 1
select falcon_visits,
dbo.[as_yoy](falcon_visits, falcon_visitsPrev) desc_falcon_visits
Сама функция выглядит так:
CREATE OR ALTER FUNCTION [dbo].[as_yoy]
(
@cur decimal(18,2),
@prev decimal(18,2)
)
RETURNS nvarchar(256) as
BEGIN
return '<span title="За этот же период в прошлом году изменение. В прошлом году - '+cast(@prev as nvarchar)+'" class="'+iif(@cur>@prev, 'text-success', 'text-danger')+' font-weight-bold">'+
cast( cast((((@cur - @prev) * 100/ nullif(@prev, 0)) ) as int) as nvarchar) +'%'+
'</span>'
END
В подсказке выводится значение за предыдущий период.