Как в MDX для SSAS создать расчетную меру, которая суммирует значения мер [промежуточные итоги] и [обороты]?

У меня есть мера с итогами на определенные даты, использующая агрегацию LastNonEmpty, и мера с оборотами, применяющая агрегацию Sum. Могу ли я получить помощь в создании меры, которая бы рассчитывала итоги на каждый день, учитывая последние известные итоги и добавляя обороты с даты последних итогов до текущей даты?

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

```sql
WITH 
MEMBER [Measures].[LastNonEmptyDate] AS 
tail( 
  filter( 
    periodstodate([Дата].[год-месяц-дата].[Date Key],[Дата].[год-месяц-дата].currentmember), 
    NOT ISEMPTY([Measures].[итог]) 
  ), 1 
).item(0).member_caption 

SELECT 
{ [Measures].[LastNonEmptyDate] } ON COLUMNS, 
[Дата].[год-месяц-дата].[Date Key].MEMBERS ON ROWS 
FROM [test]
```

Однако я получаю null для всех членов, кроме тех, где текущая дата совпадает с датой итогов. Например, для 20240101 я получаю дату 20240101, а для 20240102 - null, хотя, по моим замыслам, должно быть значение 20240101. Как решить эту проблему?
  • 10 января 2025 г. 15:14
Ответы на вопрос 1
Для создания расчетной меры в MDX, которая будет суммировать значения мер `[промежуточные итоги]` и `[обороты]`, вам необходимо использовать функцию `LastNonEmpty` для получения последних значений итогов на каждую дату, а затем добавить суммы оборотов с этой даты до текущей.

Чтобы исправить вашу проблему с получением даты последних итогов, нужно обеспечить правильное использование функции `Filter` и `Tail`. Вы можете попробовать использовать следующее выражение для получения даты последних итогов, а затем далее применять эту дату для расчета мер. 

### Пример создания расчетной меры

1. Определите расчетную меру, которая будет использовать значения `[промежуточные итоги]` и `[обороты]`:

```mdx
WITH 
MEMBER [Measures].[Расчетная Мера] AS 
IIF(
    NOT ISEMPTY([Measures].[итог]), 
    [Measures].[итог] + 
    SUM(
        [Дата].[год-месяц-дата].[Date Key]. 
        Range( 
            [Measures].[LastNonEmptyDate], 
            [Дата].[год-месяц-дата].CurrentMember 
        ), 
        [Measures].[обороты]
    ), 
    [Measures].[LastNonEmptyDate]
)
SELECT 
    { [Measures].[Расчетная Мера] } ON COLUMNS,
    [Дата].[год-месяц-дата].[Date Key].MEMBERS ON ROWS 
FROM [test]
```

2. Для получения последних известный итогов, вы можете написать следующую меру, чтобы получить последние известные значения, как вы делали ранее, но учтя, что при использовании `Tail` вам нужно скорректировать параметры фильтрации:

```mdx
WITH 
MEMBER [Measures].[LastNonEmptyDate] AS 
    IIF(
        NOT IsEmpty([Measures].[итог]), 
        [Дата].[год-месяц-дата].CurrentMember.Member_Value, 
        Tail(
            Filter(
                [Дата].[год-месяц-дата].[Date Key]. 
                Range(
                    [Дата].[год-месяц-дата].[Date Key].FirstChild, 
                    [Дата].[год-месяц-дата].CurrentMember
                ), 
                NOT IsEmpty([Measures].[итог])
            ), 
            1
        ).Item(0).Member_Value
    )

SELECT 
    { [Measures].[LastNonEmptyDate] } ON COLUMNS, 
    [Дата].[год-месяц-дата].[Date Key].MEMBERS ON ROWS 
FROM [test]
```

### Построение полного запроса

Теперь объедините обе части и создайте итоговую меру, суммирующую значения двух мер. Это одновременно обеспечит получение последних известных итогов и сумму оборотов, необходимых для работы с каждой датой.

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