Агрегировать данные в иерархии SSAS - PullRequest
0 голосов
/ 18 декабря 2018

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

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

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

with member DirectD as (iif(([Department].[Departments].currentmember.datamember, [Measures].[Department Billing Target]) = null, ([Measures].[Department Billing Target]), ([Department].[Departments].currentmember.datamember, [Measures].[Department Billing Target])))

Проблема в том, что я не могу гарантировать, что одна и та же логика применяется к каждому узлу "вниз" иерархии.Параметр MembersWithData установлен на NonLeafDataHidden в измерении.[Measures].[Department Billing Target] является вычисляемым элементом, поэтому, похоже, Aggregate не является опцией.

В качестве примера, я хотел бы получить значение 3000, если я запрашиваю цель выставления счета для отдела A (изображение 1): Image 1

Для отдела C на рисунке 2 мне нужно получить 1400 (E, имея потомков, имеет фактическое значение, которое имеет приоритет над суммой его детей).Image 2

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

В конце я добавил следующее решение, которое работает до сих пор:

    IIF(NOT ISEMPTY(([Department].[Departments].CURRENTMEMBER.DATABEMBER, [Measures].[Department Billing Target Canonical])), 
  ([Department].[Departments].CURRENTMEMBER.DATABEMBER, [Measures].[Department Billing Target Canonical]), 
  IIF(ISEMPTY(SUM(descendants([Department].[Departments].CURRENTMEMBER, [Department].[Departments], AFTER), IIF(
    ISEMPTY(([Department].[Departments].CURRENTMEMBER.parent.DATABEMBER, [Measures].[Department Billing Target Canonical])), 
    ([Department].[Departments].CURRENTMEMBER.DATABEMBER, [Measures].[Department Billing Target Canonical]), 
    NULL))), 
  ([Department].[Departments].CURRENTMEMBER.DATABEMBER, [Measures].[Department Billing Target Canonical]), 
  SUM(descendants([Department].[Departments].CURRENTMEMBER, [Department].[Departments], AFTER), IIF(
    ISEMPTY(([Department].[Departments].CURRENTMEMBER.parent.DATABEMBER, [Measures].[Department Billing Target Canonical])), 
    ([Department].[Departments].CURRENTMEMBER.DATABEMBER, [Measures].[Department Billing Target Canonical]), 
    NULL))))

Конечно, это может быть не самое красивое решение (на самом деле я уверен, что оно одно из самых уродливых), но это работает для меня.

Суть в том, что алгоритм проверяет, есть ли у родительского узла текущего данные какие-либо данные (currentmember.parent.datamember), и если да, заменяет значение текущего члена наНОЛЬ.Все эти значения накапливаются в наборе, и сумма его «содержимого» является результирующим значением.Наилучший ИИФ предназначен для того, чтобы покрыть своего рода крайний случай.

РЕДАКТИРОВАТЬ: Существует также ощущение, что весь этот вопрос является просто вопросом некоторых настроек SSAS, которые необходимо изменить.Этот параметр продолжает ускользать от меня.

0 голосов
/ 20 декабря 2018

Иерархия, о которой вы говорите, кажется иерархией родительских детей, поскольку вы говорите: «Проблема в том, что данные в таблице фактов не ограничиваются« конечными »отделами в дереве иерархии».Исходя из этого, проблема в том, что нам нужно решить: 1) Каждый элемент иерархии, который мы называем базовым атрибутом.2) Если значение меры для базового атрибута равно нулю, мы возвращаем суммированное значение. 3) Если значение меры для базового атрибута не равно нулю, то мы возвращаем значение отдельных элементов.Ниже приведен фрагмент кода, могут быть некоторые проблемы с синтаксисом, но он может объяснить идею.

Приведенный ниже код является похожим примером для приключенческих работ (я добавил атрибут FullName в измерение сотрудника).На рисунке справа - базовый атрибут родительской дочерней иерархии.На этом снимке показаны все сотрудники, у которых были продажи.Слева находится иерархия, обратите внимание, как значения изменяются в тестовой мере для людей, которые присутствуют справа.Например, взгляните на «Эми Э. Альбертс»

enter image description here

Код

with member [Measures].test as
case when [Employee].[Employees].currentmember.name='All Employees' 
then [Measures].[Reseller Sales Amount]
when (strtomember('[Employee].[Full Name].['+[Employee].[Employees].currentmember.name+']'),[Measures].[Reseller Sales Amount])=null 
then [Measures].[Reseller Sales Amount]
else (strtomember('[Employee].[Full Name].['+[Employee].[Employees].currentmember.name+']'),[Measures].[Reseller Sales Amount])
end
select {[Measures].[Reseller Sales Amount],[Measures].test}
on columns,
[Employee].[Employees].members 
on rows from [Adventure Works]
...