Многомерные выражения для суммирования по месяцам с непустым значением меры для месяца



Это ставило меня в тупик, и я не знаю, почему это так трудно.
У меня есть мера, которая имеет пустые значения до определенного момента времени, а затем начинает иметь значения. Я хочу получить среднемесячное значение, но только по тем месяцам, которые на самом деле имеют непустое значение. Я также хочу, чтобы мой временной диапазон был зафиксирован для запроса независимо от того, какие месяцы имеют значения (например, в течение всего года)



Вот один из вариантов многомерных выражений, который я попробовал:



WITH 
MEMBER Measures.MonthsWithSales AS
(IIF( IsEmpty(([Time].[Month].CurrentMember,[Measures].[ProductsSold])), 0, [Measures].[MonthCount]))

MEMBER Measures.AvgProductsSold AS
[Measures].[ProductsSold] /Measures.MonthsWithSales

SELECT
{
[Measures].[ProductsSold], [Measures].[MonthCount],
[Measures].[MonthsWithSales], [Measures].[AvgProductsSold]
} ON 0,

[Time].[Month].Members ON 1

FROM MyCube
WHERE [Time].[Year].&[2010-01-01T00:00:00]


Который возвращает что-то вроде этого:



    ProductsSold    MonthCount  MonthsWithSales AvgProductsSold
All 1644 12 **12** **137**
2010-01-01 00:00:00.000 (null) 1 0 (null)
2010-02-01 00:00:00.000 (null) 1 0 (null)
2010-03-01 00:00:00.000 (null) 1 0 (null)
2010-04-01 00:00:00.000 (null) 1 0 (null)
2010-05-01 00:00:00.000 (null) 1 0 (null)
2010-06-01 00:00:00.000 234 1 1 234
2010-07-01 00:00:00.000 237 1 1 237
2010-08-01 00:00:00.000 236 1 1 236
2010-09-01 00:00:00.000 232 1 1 232
2010-10-01 00:00:00.000 232 1 1 232
2010-11-01 00:00:00.000 233 1 1 233
2010-12-01 00:00:00.000 240 1 1 240


Проблема находится на всем ряду.
Я ожидаю, что MonthsWithSales в течение всего года возвращает 7, а не 12
и это AvgProductsSold (в месяц с продажами) составляет 234,86, а не 137.



Я понимаю, что он не делает то, что я хочу, потому что он использует MonthCount на всех уровнях. Но я не знаю, как "погрузиться" в измерение "за месяц", чтобы суммировать MonthCount только по соответствующим месяцам, когда он вычисляет "все".
410   2  

2 ответов:

Я предположил, что у вас есть 2 уровня в иерархии месяца: один с членом All и один для месяцев.

MEMBER Measures.AvgProductsSold AS 
            IIf([Time].[Month].CurrentMember.Level.Ordinal = 0
                    , Avg([Time].[Month].CurrentMember.Children, [Measures].[ProductsSold])
                    , [Measures].[ProductsSold])

(Возможно, вам придется заменить [Time].[Month].CurrentMember.Children на [Time].[Month].Members)

ФункцияAvg вычисляет среднее значение по непустым значениям.

Вот запрос, который я, вероятно, в конечном итоге использую, правильно используя мою временную иерархию:

WITH 
MEMBER [Measures].[MonthsWithSales]
AS
COUNT
(
    FILTER
    (
        DESCENDANTS([Time].[YQMD].CurrentMember,[Time].[YQMD].[Month]),
        NOT ISEMPTY([Measures].[ProductsSold])
    )
)

MEMBER
[Measures].[AvgProductsSold]
AS
[Measures].[ProductsSold]/[Measures].[MonthsWithSales]

SELECT
{
[Measures].[ProductsSold],
[Measures].[MonthsWithSales],
[Measures].[AvgProductsSold]
} ON 0,

[Time].[Month].Members ON 1

FROM MyCube

[YQMD] - это временная иерархия с уровнями: 1 год, 2 квартал, 3 месяц, 4 Дата

Comments

    Ничего не найдено.