MDX - среднее значение за весь период времени, даже если данные отсутствуют - PullRequest
1 голос
/ 24 сентября 2019

У меня есть таблица фактов с 1 строкой для каждого дня.Пример:

ID  Date     Value
1   20190101 10
1   20190102 15
2   20190101 31

Если я возьму простое среднее значение в кубе SSAS, я получу:

ID Average <Formula>
1  12.5    (10+15)/2
2  15.5    31/2

Как я понимаю, 15,5 есть, потому что в общей сложности 2 дня в объемепоскольку в данных факта существует только два дня, когда я выбираю целый месяц.

Однако мне нужно вместо этого вычислить среднее значение в месяц .Он должен проверить, что в этом месяце 31 день (на основе измерения даты) и получить такой результат:

ID Average <Formula>
1  0.8     (10+15)/31
2  1       31/31

До сих пор я пытался создать несколько «фальшивых строк», если мои данные, например,Я пытался создать строки со значением = 0 для дат 20190103-20190131 для идентификатора = 1.

Это работает, это заставляет расчет для идентификатора = 1 всегда принимать все дни в периоде, но это портитдругие мои вычисления в кубе.

Есть ли другие способы принудительного вычисления среднего значения в многомерном кубе SSAS , чтобы всегда рассчитывать весь месяц?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

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

Например, в следующем приведено количество дней в месяце.с использованием AdventureWorks образец

WITH MEMBER Measures.DayCount AS 
    Descendants
    ( 
        [Date].[Calendar].CurrentMember,   
        [Date].[Calendar].[Date],
        LEAVES  
    ).Count

SELECT [Measures].[DayCount] ON 0,
        [Date].[Calendar].[Month].ALLMEMBERS ON 1 
FROM [Adventure Works]

enter image description here

1 голос
/ 24 сентября 2019

Я бы порекомендовал:

select id, eomonth(date) as eom,
       sum(value) * 1.0 / day(eomonth(date)) as average
from t
group by id, eomonth(date);

EOMONTH() возвращает последний день месяца.Вы можете извлечь день, чтобы получить количество дней в месяце.

* 1.0 потому, что SQL Server выполняет целочисленное деление.Ваши числа выглядят как целые числа, но если вы получаете 15,5, то на самом деле у вас есть numeric s или что-то иное, чем целое число.

...