Проблема с вычисляемым членом всегда равна нулю - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть простая таблица фактов со столбцом AverageBalance, TimeKey (это всегда дата конца месяца), AccountKey и AccountClassKey.

И я добавил вычисляемый элемент, который будет рассчитывать средний баланс на разных уровнях времениИерархия.

CREATE MEMBER CURRENTCUBE.[Measures].[Average Calc] AS 
    Avg(
      EXISTING([Time].[Processing Date].[Processing Date].MEMBERS) ,
      [Measures].[Avg Bal]
    ) ;

И все работает нормально.

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

Итак, я попробовал что-то вроде этого (сначала я добавил в качестве меры ключ класса учетной записи):

CREATE MEMBER CURRENTCUBE.[Measures].[AvgBalMult] AS
[Measures].[Avg Bal] * (
       CASE 
       WHEN [Measures].[Account Class Key] = 1 THEN 1  
       WHEN [Measures].[Account Class Key] = 2 THEN -1
       else 0
       END);

Но я всегда получаю нули в отчете, когда я агрегирую по времени ипонял, что это потому, что показатель класса учетной записи сначала агрегируется, и поэтому он никогда не будет иметь значения 1 или 2, если я не смотрю только на уровне учетной записи.

В конце я хотел бы получить что-то вродеэто:

CREATE MEMBER CURRENTCUBE.[Measures].[Average Calc] AS 
    Avg(
      EXISTING([Time].[Processing Date].[Processing Date].MEMBERS) ,
      [Measures].[Avg Bal] * (
       CASE 
       WHEN [Measures].[Account Class Key] = 1 THEN 1  
       WHEN [Measures].[Account Class Key] = 2 THEN -1
       else 0
       END)
    ) ;

На уровне аккаунта он даст мне Средний остаток без знака, но при агрегации он должен агрегировать с логикой выше.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Попробуйте заменить первые две части кода ниже.Я предположил, что "AccountClassKey" на самом деле является атрибутом измерения, что вы сделали меру только для этого расчета.Исходя из этого, я назвал его «[DimAccount]. [AccountClass]. [Ключ класса учетной записи]»

CREATE MEMBER CURRENTCUBE.[Measures].[AccountClassKeyMultipiler] AS
(
CASE 
WHEN [DimAccount].[AccountClass].[Account Class Key].currentmember.Properties ("Member_Value",TYPED) = "1" THEN 1  
WHEN [DimAccount].[AccountClass].[Account Class Key].currentmember.Properties ("Member_Value",TYPED) = "2" THEN -1  
else 0
END);

CREATE MEMBER CURRENTCUBE.[Measures].[AvgBalMult] AS
[Measures].[Avg Bal] * [Measures].[AccountClassKeyMultipiler]

Править. Здесь я пытался решить аналогичный случай в Приключенческих работах

Мы перечисляем продукты и месяцы с их продажами

select 
{[Measures].[Internet Sales Amount]
}
on columns,
(
[Product].[Category].[Category],
[Date].[Month of Year].[Month of Year]
)
on rows 
from 
[Adventure Works]
where [Date].[Calendar Year].&[2013]

Result1

Далее мы преобразуем приведенный выше запрос, чтобы получить средние продажи для каждого продукта на основе месяцев

with member 
[Measures].[Internet Sales AmountAvg]
as
Avg(EXISTING([Date].[Month of Year].[Month of Year]) ,[Measures].[Internet Sales Amount]) 
select 
{
[Measures].[Internet Sales Amount]
,
[Measures].[Internet Sales AmountAvg]
}
on columns,
(
[Product].[Category].[Category]
)
on rows 
from 
[Adventure Works]
where [Date].[Calendar Year].&[2013]

Result2

Теперь мы добавим множитель на основе регистра. Взгляните на последний столбец

with
member [Measures].[Internet Sales AmountAvg]
as
Avg(EXISTING([Date].[Month of Year].[Month of Year]) ,[Measures].[Internet Sales Amount]) 

member [Measures].[Multipiler]
as
CASE 
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Accessory' THEN 1  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Mountain' THEN 2  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Road' THEN 3  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Touring' THEN 4 
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Components' THEN 5  
else 0
END

member [Measures].[Internet Sales AmountAvg2]
as
[Measures].[Internet Sales AmountAvg]*[Measures].[Multipiler]

select 
{
[Measures].[Internet Sales Amount]
,
[Measures].[Internet Sales AmountAvg]
,
[Measures].[Multipiler]
,
[Measures].[Internet Sales AmountAvg2]
}
on columns,
(
[Product].[Category].[Category],[Product].[Product Line].[Product Line]
)
on rows 
from 
[Adventure Works]
where [Date].[Calendar Year].&[2013]

Result 3

Теперь давайте посмотрим, что произойдет, если мы удалим [Product]. [Product Line]. [Product Line] из строк

with
member [Measures].[Internet Sales AmountAvg]
as
Avg(EXISTING([Date].[Month of Year].[Month of Year]) ,[Measures].[Internet Sales Amount]) 

member [Measures].[Multipiler]
as
CASE 
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Accessory' THEN 1  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Mountain' THEN 2  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Road' THEN 3  
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Touring' THEN 4 
WHEN [Product].[Product Line].currentmember.Properties ("Member_Value",TYPED) = 'Components' THEN 5  
else 0
END

member [Measures].[Internet Sales AmountAvg2]
as
[Measures].[Internet Sales AmountAvg]*[Measures].[Multipiler]

select 
{
[Measures].[Internet Sales Amount]
,
[Measures].[Internet Sales AmountAvg]
,
[Measures].[Multipiler]
,
[Measures].[Internet Sales AmountAvg2]
}
on columns,
(
[Product].[Category].[Category]
)
on rows 
from 
[Adventure Works]
where [Date].[Calendar Year].&[2013]

Result 4

Суть в том, что в тех случаях, когда поведение меры зависит от значения атрибута измерения, вам необходимо иметь этот атрибут измерения на одной из осей.Когда его нет, используется значение по умолчанию.Если значение по умолчанию не обрабатывается в логике, вы получите неправильные результаты

...