Ssas 在mdx中使用iif命名集

Ssas 在mdx中使用iif命名集,ssas,mdx,Ssas,Mdx,我试图使用命名集生成计算维度属性,但我对mdx不太熟悉。我希望属性包含基于4个不同属性值的描述。我尝试使用的是以下代码,但它必须具有无效语法(给出错误) 我不太清楚多维数据集脚本,因为我不使用这些脚本,但通过谷歌搜索得到了以下信息 请不要使用和进行测试,因为我认为这也会导致错误 create set [pet types] as iif([Vw Cube Customer Dim].[Has Pet].&[Yes], iif([Vw Cube Customer Dim].[Ha

我试图使用命名集生成计算维度属性,但我对mdx不太熟悉。我希望属性包含基于4个不同属性值的描述。我尝试使用的是以下代码,但它必须具有无效语法(给出错误)


我不太清楚多维数据集脚本,因为我不使用这些脚本,但通过谷歌搜索得到了以下信息

请不要使用
进行测试,因为我认为这也会导致错误

create set [pet types]
as

iif([Vw Cube Customer Dim].[Has Pet].&[Yes],
    iif([Vw Cube Customer Dim].[Has Cat].&[Yes],
        iif([Vw Cube Customer Dim].[Has Dog].&[Yes],
            iif([Vw Cube Customer Dim].[Has Other Pet].&[Yes],
                "Multiple Pets","Cat and Dog"),
        "Cat"),
    iif([Vw Cube Customer Dim].[Has Dog].&[Yes] 
        and [Vw Cube Customer Dim].[Has Pet].&[Yes],
        "Dog and other Pet","Dog")),
"No Pet")
我建议将其改为null,这样度量值就会变得稀疏,而不是“无宠物”,因为这是
olap
的要点之一

CREATE MEMBER CURRENTCUBE.Measures.PetType 
AS 
'
iif([Vw Cube Customer Dim].[Has Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Pet].&[Yes],
    iif([Vw Cube Customer Dim].[Has Cat].CurrentMember IS [Vw Cube Customer Dim].[Has Cat].&[Yes],
        iif([Vw Cube Customer Dim].[Has Dog].CurrentMember IS [Vw Cube Customer Dim].[Has Dog].&[Yes],
            iif([Vw Cube Customer Dim].[Has Other Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Other Pet].&[Yes],
                "Multiple Pets","Cat and Dog"),
        "Cat"),
    iif(([Vw Cube Customer Dim].[Has Dog].CurrentMember IS [Vw Cube Customer Dim].[Has Dog].&[Yes]) 
        AND ([Vw Cube Customer Dim].[Has Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Pet].&[Yes]),
        "Dog and other Pet","Dog")),
"No Pet")
'
为了提高可读性(但会降低可伸缩性),我宁愿使用状态矩阵和每个层次结构成员的系数:

然后添加几个成员及其权重:

CREATE MEMBER CURRENTCUBE.[Measures].[Has Pet Value] as
IIF([Vw Cube Customer Dim].[Has Pet].CurrentMember
 IS [Vw Cube Customer Dim].[Has Pet].&[Yes],8,0);

CREATE MEMBER CURRENTCUBE.[Measures].[Has Cat Value] as
IIF([Vw Cube Customer Dim].[Has Cat].CurrentMember
 IS [Vw Cube Customer Dim].[Has Cat].&[Yes],4,0);

CREATE MEMBER CURRENTCUBE.[Measures].[Has Dog Value] as
IIF([Vw Cube Customer Dim].[Has Dog].CurrentMember
 IS [Vw Cube Customer Dim].[Has Dog].&[Yes],2,0);

CREATE MEMBER CURRENTCUBE.[Measures].[Has Other Pet Value] as
IIF([Vw Cube Customer Dim].[Has Other Pet].CurrentMember
 IS [Vw Cube Customer Dim].[Has Other Pet].&[Yes],1,0);
最后两名成员:1)寻求支持,2)获得理想的结果

CREATE MEMBER CURRENTCUBE.[Measures].[Pet Types Value] as
([Measures].[Has Pet Value]
+[Measures].[Has Cat Value]
+[Measures].[Has Dog Value]
+[Measures].[Has Other Pet Value]);

CREATE MEMBER CURRENTCUBE.[Measures].[Pet Types] as
case [Measures].[Pet Types Value]
    when 15 then "Multiple Pets"
    when 14 then "Cat and Dog"
    when 13 then "Cat and other Pet"
    when 12 then "Cat"
    when 11 then "Dog and other Pet"
    when 10 then "Dog"
    else "No Pet" end;

添加另一个维度/层次结构进行分析(比如说
[Vw Cube Customer Dim].[Has Bird].&[Yes]
)可能会导致添加具有下一个权重的新成员(本例中为16),并重新计算
[Pet Types Value]
[Pet Types]
奇怪的
mdx
您使用了哪些参考来得出这个结论?可读性需要一些工作。一个明显的问题是,您试图创建一个度量值,而不是一个集合。集合是一组成员-脚本根据条件返回字符串-度量也是如此。我使用了各种引用和我的想象力。具体来说,我有一个用于计算列的dax脚本,并尝试在mdx中实现它。我明白你对我误解的意思。那么,如何用这种逻辑生成一个计算列呢?DSV上的命名计算没有帮助,因为case语句不支持具有公共成员(相交)的集合。我使用
MDX
查询多维数据集-我不参与多维数据集脚本,因此可能没有多大帮助。如果您可以将问题抽象为一个正常的
MDX
脚本(
使用…选择…从…何处
),那么我可以提供帮助。为了安全起见:集合未满,“猫和其他宠物”丢失:[Vw Cube客户Dim]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[有宠物]。[([Vw Cube Customer Dim].[Has Dog].&[Yes])我喜欢这样做(特别是选择的权重)@whytheq,我还考虑增加此解决方案的可扩展性和自动化。Smth喜欢:添加一个包含标识列和所需成员(cat、Dog等)的表,然后将DSV中的权重计算为2^ID并添加类似属性。最后,使用此属性而不是添加Has_Animal_值度量值。但是手动编辑[measures].[Pet Types]是不可避免的。求和的技巧非常有用。我使用它来构造所需的维度属性。谢谢