MDX - 检索当前在 where 子句中使用的成员级别

MDX - Retrieving a level of members currently used in where clause

我有一个定义了组织结构层次结构的简单数据立方体。在多维数据集内的计算中,我希望根据 MDX 查询中 WHERE 子句中当前使用的组织项目级别进行不同的计算。

假设我有 5 个级别的组织结构,对于最后一个级别(商店级别),我想更改使用表达式进行计算的方式,例如:

IIF([Organization Structure].[Parent Id].LEVEL IS [Organization Structure].[Parent Id].[Level 05], 'THIS IS STORE', 'THIS IS NOT')

这在 Visual Studio 浏览器中产生了我们真正想要的东西:

同样使用 MDX 查询,如:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123]
}

当我们想在 WHERE 子句中使用多个组织结构项时,问题就出现了。在这个子句中只允许有来自同一级别的项目,我仍然想知道它是哪个级别,但是当然当我们将第二个项目添加到 WHERE 时,就像这样:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123],
[Organization Structure].[Parent Id].&[124]
}

我收到 "currentmember failed because the coordinate for the attribute contains a set" 的错误。

这就是为什么在我的表达中我尝试在许多不同的配置中使用 ITEM(0) 函数,但我只是找不到一种方法来将它用于当前在 [=35 中使用的一组项目上=]WHERE 子句...所以最大的问题是:

如何获取当前正在执行的 WHERE 子句中列出的一组项目,以便我可以在该组上使用 Item(0),或者是否有任何其他检索级别的方法当前选择的项目知道它们必须处于同一级别?

where 子句中结合使用 Currentmemberset 可能存在问题。

请参阅来自克里斯·韦伯的 post:http://blog.crossjoin.co.uk/2009/08/08/sets-in-the-where-clause-and-autoexists/

针对您的情况,有一个可能的解决方法:您可以尝试适应您的情况。

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
       (existing [Geography].[Geography].[State-Province].members).item(0).Level
      IS 
       [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
SELECT 
  {[Measures].[x]} ON COLUMNS
FROM [Adventure Works]
WHERE
(
{[Geography].[Geography].[State-Province].&[77]&[FR],
[Geography].[Geography].[State-Province].&[59]&[FR]}
);

扩展上面的内容以证明它有效:

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
        (EXISTING 
          [Geography].[Geography].[State-Province].MEMBERS).Item(0).Level
      IS 
        [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
  MEMBER [Measures].[proof] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Item(0).Member_Caption 
  MEMBER [Measures].[proof2] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Count 
SELECT 
  {
    [Measures].[x]
   ,[Measures].[proof]
   ,[Measures].[proof2]
  } ON COLUMNS
FROM [Adventure Works]
WHERE 
  {
    [Geography].[Geography].[State-Province].&[77]&[FR]
   ,[Geography].[Geography].[State-Province].&[59]&[FR]
  };

结果如下:

所以你的表情可能会变成这样:

IIF
(
    (EXISTING 
      [Organization Structure].[Parent Id].MEMBERS).Item(0).Level
  IS 
    [Organization Structure].[Parent Id].[Level 05]
 ,'THIS IS STORE'
 ,'THIS IS NOT'
)