Как считать показатели год-к-году (YoY) в отчете по периодам

Очень полезно бывает знать как изменился показатель по отношению тому же месяцу или кварталу за прошлый год. 

Для эого используем показать год к году - YOY. 

Его формула 

((Б – А) / А) * 100

Как технически это вывести в отчете по периодам? 

При вычислении дат начала и конца периода для недель, месяцев и кварталов дополнительно вычисляем даты аналогичного периода, но за прошлый год (@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 

В подсказке выводится значение за предыдущий период. 

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK