针对年龄段的MDX IIF声明出乎意料地落空

时间:2017-06-08 14:51:40

标签: scope mdx bucket iif

我是BI领域的新手,并且已经在OLAP,Cubes和MDX上迈出了第一步。

现在,我陷入了一个看似微不足道的问题,我无法理解,非常想征求意见。

我想根据年龄,日期,物品上次销售日期和指定的报告日期,在年龄桶中组织库存物品。我为此目的创建了一个Age Bucket维度,用桶[0..6]个月,[6..12]个月等等。

然后,我创建了一个计算的度量,我只想为每个项目设置匹配的Age Bucket(0,1,2,3,4),基于ItemAgeSales的天数,如下所示:

CREATE MEMBER CURRENTCUBE.[MEASURES].[TEST] AS NULL,
VISIBLE = 1, ASSOCIATED_MEASURE_GROUP = 'Item Transaction';

SCOPE(MEASURES.[TEST]);
(STRTOMEMBER("[Age Bucket].[Age Bucket].&[" +
    IIF( [MEASURES].[ItemAgeSales] >= 730 , "4",
        IIF([MEASURES].[ItemAgeSales] >= 548 , "3",
            IIF([MEASURES].[ItemAgeSales] >= 365 , "2",
                IIF([MEASURES].[ItemAgeSales] >= 183 , "1", "0"
                )//1,0
            )//2
        )//3
    )//4
+ "]")
)
= [MEASURES].[ItemAgeSales];
END SCOPE;

上述脚本的问题在于,无论项目的ItemAgeSales度量的值如何,该项目总是落到桶“0”(即[0..6]个月)并且不清楚我为什么会这样。

有没有人看到我做错了什么或对此有一些有用的想法或暗示解决问题?任何帮助将不胜感激!

Image of Cube Browser showing that ItemAgeSales is always set for the 0..6 Age Bucket, instead for the correct bucket.

1 个答案:

答案 0 :(得分:1)

问题在于,由于编写MDX的方式,当用户连接到多维数据集时,不会在任何查询或报表或过滤器的上下文中评估IIF函数。在连接时评估等号左边的任何内容或SCOPE语句的参数。在查询时评估右边的所有内容。

我假设您希望IIF语句依赖于报表包含的任何过滤器(例如按Item维度或其他过滤)。我会将MDX更改为...

CREATE MEMBER CURRENTCUBE.[MEASURES].[TEST] AS NULL,
VISIBLE = 1, ASSOCIATED_MEASURE_GROUP = 'Item Transaction';

SCOPE(MEASURES.[TEST]);
  [Age Bucket].[Age Bucket].&[4] = IIF([MEASURES].[ItemAgeSales] >= 730 , [MEASURES].[ItemAgeSales], NULL);
  [Age Bucket].[Age Bucket].&[3] = IIF([MEASURES].[ItemAgeSales] >= 548 and [MEASURES].[ItemAgeSales] < 730, [MEASURES].[ItemAgeSales], NULL);
  [Age Bucket].[Age Bucket].&[2] = IIF([MEASURES].[ItemAgeSales] >= 365 and [MEASURES].[ItemAgeSales] < 548, [MEASURES].[ItemAgeSales], NULL);
  [Age Bucket].[Age Bucket].&[1] = IIF([MEASURES].[ItemAgeSales] >= 183 and [MEASURES].[ItemAgeSales] < 365, [MEASURES].[ItemAgeSales], NULL);
  [Age Bucket].[Age Bucket].&[0] = IIF([MEASURES].[ItemAgeSales] < 183, [MEASURES].[ItemAgeSales], NULL);
END SCOPE;