Расчет MDX с детьми и родителями (вклад в итог)

У меня появился куб с кадастровой информацией некоторых районов города. Одним из показателей является «кадастровая стоимость»: стоимость земли в районе. Теперь город делится на районы и район, на микрорайоны (иерархия с двумя уровнями).

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

Как мне это сделать?

Я попытался:

WITH MEMBER
[Measures].[Percentage] AS 
  ([Nbh].[Nbh].[Nbh],[Measures].[Cad value].CurrentMember
   /[Nbh].[Nbh].[Nbh],[Measures].[Cad value].CurrentMember.Parent)

SELECT 
 {[Measures].[Percentage]} ON 0,
 [Nbh].[Nbh].[Nbh].AllMembers ON 1
FROM Cadastre

Где размеры:

Nbh : окрестности

Кадастровая стоимость: Кадастровая стоимость

То, что я получаю, это «ошибка» в каждом значении результата, а объяснение: «Текущий член (): несоответствие типа аргумента (0): ожидается:« уровень | иерархия | измерение », получено:« мера »»

Что я делаю не так?


person Gustavo Moreno    schedule 28.10.2015    source источник


Ответы (3)


WITH MEMBER [Measures].[Percentage] AS
([Nbh].[Nbh].[Nbh],[Measures].[Cad value].CurrentMember /[Nbh].[Nbh].[Nbh],[ Меры].[Cad value].CurrentMember.Parent)

С этим есть две проблемы:

Во-первых, вы используете статический набор для вычисления значения вычисляемого члена, а именно: [Nbh].[Nbh].[Nbh] Это НЕ [Nbh].[Nbh].CURRENTMEMBER

Вторая и большая ошибка: использование currentmember на мере. Вы не можете этого сделать. Вы можете использовать Measures.CURRENTMEMBER, но это все. Это лучше всего использовать в иерархиях, которые используются на осях.

Тем не менее, ваш подход почти законен. Вам нужно получить значение меры для родителя.

Это должно работать:

WITH MEMBER
[Measures].[Percentage] AS 
DIVIDE
        (
        [Measures].[Cad value], 
        ([Nbh].[Nbh].CURRENTMEMBER.PARENT,[Measures].[Cad value]) //Cad value for parent
        )

SELECT 
 {[Measures].[Percentage]} ON 0,
 [Nbh].[Nbh].[Nbh].AllMembers ON 1
FROM Cadastre
person SouravA    schedule 29.10.2015

Попробуйте следующее:

WITH MEMBER [Measures].[Parent %] AS 
   IIF(
    [Nbh].[Nbh].CURRENTMEMBER IS [Nbh].[Nbh].[All]
    ,1
    ,[Measures].[Cad value] /
     (
      [Measures].[Cad value],
      [Nbh].[Nbh].CurrentMember.Parent
     )
   ), FORMAT_STRING = 'Percent'
SELECT 
 {[Measures].[Parent %]} ON 0,
 [Nbh].[Nbh].[Nbh].AllMembers ON 1
FROM Cadastre;

Включение IIF является защитной мерой. Если вы переключитесь на отображение AllMembers всей иерархии, будет включен All член. Вот пример использования AdvWrks:

WITH 
  MEMBER [Measures].[Parent %] AS 
    IIF
    (
        [Product].[Subcategory].CurrentMember
      IS 
        [Product].[Subcategory].[All Products]
     ,1
     ,
        [Measures].[Internet Sales Amount]
      / 
        (
          [Measures].[Internet Sales Amount]
         ,[Product].[Subcategory].CurrentMember.Parent
        )
    ) 
   ,FORMAT_STRING = 'Percent' 
SELECT 
  NON EMPTY 
    {[Measures].[Parent %]} ON 0
 ,NON EMPTY 
    [Product].[Subcategory].ALLMEMBERS ON 1
FROM [Adventure Works];

Приведенное выше возвращает следующее:

введите здесь описание изображения

Без IIF выражение выглядит следующим образом:

WITH 
  MEMBER [Measures].[Parent %] AS 
      [Measures].[Internet Sales Amount]
    / 
      (
        [Measures].[Internet Sales Amount]
       ,[Product].[Subcategory].CurrentMember.Parent
      ) 
   ,FORMAT_STRING = 'Percent' 
SELECT 
  NON EMPTY 
    {[Measures].[Parent %]} ON 0
 ,NON EMPTY 
    [Product].[Subcategory].ALLMEMBERS ON 1
FROM [Adventure Works];

Мы получаем следующее из-за отсутствия предвидения:

введите здесь описание изображения

person whytheq    schedule 28.10.2015
comment
Это даст следующую ошибку: The Measures hierarchy already appears in the Axis0 axis. - person SouravA; 29.10.2015
comment
Кроме того, вам не нужно беспокоиться о работе с [Nbh].[Nbh].[All], если у вас есть [Nbh].[Nbh].[Nbh].AllMembers на оси. - person SouravA; 29.10.2015
comment
@SouravA, включая пункт WHERE, был опечаткой. Работа с участником [All] является хорошей практикой. - person whytheq; 29.10.2015
comment
Здесь не нужно, но вы можете не сомневаться :) - person SouravA; 29.10.2015
comment
@SouravA Я добавил полный пример того, почему это хорошая практика. Спасибо. - person whytheq; 29.10.2015
comment
Я в курсе. Просто у Dim.hier.level.allmembers не будет члена All. - person SouravA; 29.10.2015

Ошибка, безусловно, из-за того, что это утверждение неверно:

WITH MEMBER
[Measures].[Percentage]
AS ([Nbh].[Nbh].[Nbh],[Measures].[Cad value].CurrentMember/[Nbh].[Nbh].[Nbh],[Measures].[Cad value].CurrentMember.Parent)

Попробуй сделать вот так

WITH MEMBER
[Measures].[Percentage]
AS ([Nbh].[Nbh].[Nbh],[Measures].[Cad value])/([Nbh].[Nbh].[Nbh],[Measures].[Cad value])
person pirmas naujas    schedule 28.10.2015
comment
Это не сработает, вам нужно закрыть круглую скобку перед '/', чтобы определить кортеж: ([Nbh].[Nbh].[Nbh],[Measures].[Cad value]) / ([Nbh] .[Nbh].[Nbh],[Измерения].[Cad value]) - person ic3; 29.10.2015