Как сделать аналитику по периодам (таблица с интервалами дат)

Создаем такой отчет по периодам: 

Для этого указываем столбцы таблицы date, p1 ... p5 (выводимые метрики), hide_invervalType (фильтр Выбор радио) с процедурой dict: 

select 'day' Value, 'Дни' Text, '' Color, 1 ord
	union	
    select 'week' Value, 'Недели' Text, '' Color, 2 ord 
	union	
    select 'month' Value, 'Месяцы' Text, '' Color, 3 ord
   union	
    select 'quarter' Value, 'Кварталы' Text, '' Color, 4 ord
    union	
    select 'year' Value, 'Года' Text, '' Color, 5 ord

Процедура getitems таблицы: 

CREATE PROCEDURE [dbo].[crud_qa-stat_getItems]
	@filters CRUDFilterParameter READONLY,  
	@sort sql_variant,
	@direction nvarchar(8),
	@page int,
	@pageSize int,
	@username nvarchar(32)
AS
BEGIN
	declare @isAdmin bit = dbo.sec_isUserInRole(@username, 'admin')

	declare @filterIntervalType nvarchar(128) = (select Value from @filters where [Key] = 'hide_intervalType')
    
 	set datefirst 1;
   	declare @periods int = 30
    if(@filterIntervalType='week') begin
    	set @periods=12
    end
    if(@filterIntervalType='month') begin
    	set @periods=15
    end
    if(@filterIntervalType='quarter') begin
		set @periods=6
	end
    if(@filterIntervalType='year') begin
    	set @periods=4
    end
    
    declare @result table(num int, name nvarchar(max), date1 datetime, date2 datetime, p1 int, p2 int, p3 int, p4 int, p5 int)
    insert into @result(num, name, date1, date2, p1, p2,p3,p4,p5)
    select num, name , date1, date2, 
    	1 p1, 2 p2, 3 p3, 4 p4, 5 p5         
    from [dbo].[as_periods] (@filterIntervalType, @periods, '',	'')
        
    -- SELECT 3
    select *, name date, @filterIntervalType hide_intervalType,
    'x1' colTitle_p1, 'x2' colTitle_p2, 'x3' colTitle_p3, 'x4' colTitle_p4, 'x5' colTitle_p5         
   from @result order by num
	-- 2 SELECT - кол-во в таблице
	select 1	

	-- 3 SELECT Дополнительные настройки таблицы
    select 1 Compact, '16px' FontSize, 1 InstantFilter, 1 HideTitleCount, 'h2' headerTag, '' Subtitle,
       '{ 
        "colorMinMaxCols": [
            	{ "code": "p1",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p2",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success  font-weight-bold" },
                { "code": "p3",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p4",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p5",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p6",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p7",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p8",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" },
                { "code": "p9",  "minClass": "text-danger font-weight-bold", "maxClass": "text-success font-weight-bold" }
            ]        
        }' ProcessOptions
    -- SELECT 4
   	select 'ИТОГО' name,
    	(select sum(p1) from @result) p1,
        (select sum(p2) from @result) p2,
        (select sum(p3) from @result) p3,
        (select sum(p4) from @result) p4,
        (select sum(p5) from @result) p5, 
        1 isHead     
END

Ключевая особенность - использование функции as_periods, которая выдает таблицу периодов. 

Остается лишь правильно написать подзапросы при заполнении @result  (там где стоят параметры p1..p5), а также поменять названия столбцов в SELECT 1.

В SELECT 4 выводятся агрегированные значения по таблице @result.

Примечание. Если в базе нет функции as_periods, то ее можно добавить вручную:

ALTER   FUNCTION [dbo].[as_periods] 
(
	@type varchar(128), 
	@cnt int,
	@format
	nvarchar(128) = '',
	@langCode nvarchar(10) = ''
)
RETURNS 
@res TABLE (num int, date1 date, date2 date, name nvarchar(128))
AS
BEGIN
if(@langCode='') set @langCode = 'ru-ru'

declare @startDate date = getdate()
declare @wwekStart date = DATEADD(dd, -(DATEPART(dw, @startDate)-1), @startDate)
declare @monthStart date = DATEADD(month, DATEDIFF(month, 0,@startDate), 0)
declare @quarterStart date = DATEADD(quarter, DATEDIFF(quarter, 0,@startDate), 0)
declare @yearStart date = DATEADD(year, DATEDIFF(year, 0,@startDate), 0)

--set datefirst 1 
;WITH nums(num) AS
 (
    SELECT 1
    UNION ALL
    SELECT num+1 
    FROM nums
    WHERE num < @cnt
 )
 insert into @res
 SELECT num,
	case @type 
	when 'day' then dateadd(day, -num+1, @startDate)
	when 'week' then dateadd(week, -num+1, @wwekStart)
	when 'month' then dateadd(month, -num+1, @monthStart)
	when 'quarter' then dateadd(quarter, -num+1, @quarterStart)
	when 'year' then dateadd(year, -num+1, @yearStart)
	else getdate()
	end date1,
	case @type 
	when 'day' then dateadd(day, -num+2, @startDate)
	when 'week' then dateadd(week, -num+2, @wwekStart)
	when 'month' then dateadd(month, -num+2, @monthStart)
	when 'quarter' then dateadd(quarter, -num+2, @quarterStart)
	when 'year' then dateadd(year, -num+2, @yearStart)
	else getdate()
	end date2,	
	case @type 
	when 'day' then format(dateadd(day, -num+1, @startDate), iif(@format<>'', @format, 'dd.MM.yyyy'), @langCode)
	when 'week' then replace( 
						format(dateadd(week, -num+1, @wwekStart), iif(@format<>'', @format,'ww неделя yyyy'), @langCode),
						'ww', datepart(week, dateadd(week, -num+1, @wwekStart))  )
	when 'month' then format(dateadd(month, -num+1, @monthStart), iif(@format<>'', @format,'MMMM yyyy'), @langCode)
	when 'quarter' then replace( 
						format(dateadd(quarter, -num+1, @quarterStart), iif(@format<>'', @format,'qq квартал yyyy'), @langCode),
						'qq', datepart(quarter, dateadd(quarter, -num+1, @quarterStart)) )
	when 'year' then format(dateadd(year, -num+1, @yearStart), iif(@format<>'', @format,'yyyy'), @langCode)
	else ''
	end name 
 FROM nums
RETURN 
END
Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

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

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

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