Reporting services 不同维度之间的Mdx并集

Reporting services 不同维度之间的Mdx并集,reporting-services,ssas,union,mdx,ssas-tabular,Reporting Services,Ssas,Union,Mdx,Ssas Tabular,在一个模型中有两个不同的维度。维度A有ColorId、FirstColor和SecondColor。维度B具有ColorId和Firstcolor。我试图从两个维度得到一个完全不同的colorid列表。请记住,此mdx需要在SSR中使用 维度A ColorId FirstColor SecondColor T0z17 Blue Green T0lqa Red Yellow 维度B ColorId First

在一个模型中有两个不同的维度。维度A有ColorId、FirstColor和SecondColor。维度B具有ColorId和Firstcolor。我试图从两个维度得到一个完全不同的colorid列表。请记住,此mdx需要在SSR中使用

维度A

ColorId     FirstColor    SecondColor
T0z17       Blue           Green
T0lqa       Red            Yellow
维度B

ColorId     FirstColor
T201k       Black
Tph1v       Orange
预期输出(仅1列)

尝试此联合查询:

WITH MEMBER [Measures].[Color] as 
   IIf(
     [Dimension A].[Color Id].CurrentMember 
        Is [Dimension A].[Color Id].[All]
   , [Dimension B].[Color Id].CurrentMember.Name
   , [Dimension A].[Color Id].CurrentMember.Name
   )
SELECT [Measures].[Color] on 0,
{
 [Dimension A].[Color Id].[Color Id].Members
 * [Dimension B].[Color Id].[All]
}
+
{
 [Dimension A].[Color Id].[All]
 * [Dimension B].[Color Id].[Color Id].Members
}
On 1
FROM [YourCube]

由于Greg的答案并不明确,我将用以下方式修复他的代码:

With 
Member [Measures].[SameColor] as
IIF(
    [Dimension A].[Color Id].CurrentMember.Name = [Dimension B].[Color Id].CurrentMember.Name,
    1,
    NULL
)

Member [Measures].[OnlyAColor] as
IIF(
    IsEmpty(
        LinkMember(
            [Dimension A].[Color Id].CurrentMember,
            [Dimension B].[Color Id]
        )
    ),
    1,
    NULL
)

Member [Measures].[OnlyBColor] as
IIF(
    IsEmpty(
        LinkMember(
            [Dimension B].[Color Id].CurrentMember,
            [Dimension A].[Color Id]
        )
    ),
    1,
    NULL
)

Member [Measures].[Color] as 
IIF(
    [Dimension A].[Color Id].CurrentMember is [Dimension A].[Color Id].[All],
    [Dimension B].[Color Id].CurrentMember.Name
    [Dimension A].[Color Id].CurrentMember.Name
)

Select [Measures].[Color] on 0,  
NonEmpty(
    [Dimension A].[Color Id].[Color Id].Members * [Dimension B].[Color Id].[Color Id].Members,
    [Measures].[SameColor]
)
+
NonEmpty(
    [Dimension A].[Color Id].[Color Id].Members * [Dimension B].[Color Id].[All],
    [Measures].[OnlyAColor]
)
+
NonEmpty(
    [Dimension A].[Color Id].[All] * [Dimension B].[Color Id].[Color Id].Members,
    [Measures].[OnlyBColor]
) on 1
From [YourCube]

对于SSA来说,这是一项非常不寻常的任务。OLAP背后的思想是只提供具有不同值的维度。这是可能的,但最简单的方法是使用SQL查询从DWH获取结果。要清楚,您希望维度A和维度B中显示相同的颜色?@greggalloway不,它不一定必须具有相同的颜色。只有列名和数据类型。颜色ID的格式与well@DanyloKorostil在ssrs中有没有这样做的方法?我不想仅仅为此添加一个单独的维度。我不能使用sql查询,因为对于我们的需求,我们只能使用表格模型。我不是ssrs专家,但很可能您必须创建两个数据集(a、B维度值),并将Lookup()函数作为连接替代方案重用。然后得到不同的值。很好,但它会产生重复的值,而不是不同的值。我重用了Greg的代码并添加了一个不同的概念。@Danylo-the
+
操作符在执行union@whytheq有趣的我不知道。不幸的是,它无法跨维度进行重复数据消除。幸运的是,Mutai澄清了重复数据消除是不必要的。@为什么EQ{[Dimension A].[Color Id].[Black]*[Dimension B].[Color Id].[All]}+{[Dimension A].[Color Id].[Color Id].[Black].[All]*[Dimension B].[Color Id].[Black]}将返回两个黑色成员。如果Dim A和Dim B对颜色使用了不同的键值,则A中的键值为红色,而B中的键值为102(完全可能)那么,
LinkMember
就不起作用了是的,你说得对。在这种情况下,可以使用名称重用strtomber()函数。我们不知道,我只是想强调一下不同的逻辑。(升级)我真的很喜欢用于重复数据消除的
非空(..,[Measures].[SameColor])
技巧。
With 
Member [Measures].[SameColor] as
IIF(
    [Dimension A].[Color Id].CurrentMember.Name = [Dimension B].[Color Id].CurrentMember.Name,
    1,
    NULL
)

Member [Measures].[OnlyAColor] as
IIF(
    IsEmpty(
        LinkMember(
            [Dimension A].[Color Id].CurrentMember,
            [Dimension B].[Color Id]
        )
    ),
    1,
    NULL
)

Member [Measures].[OnlyBColor] as
IIF(
    IsEmpty(
        LinkMember(
            [Dimension B].[Color Id].CurrentMember,
            [Dimension A].[Color Id]
        )
    ),
    1,
    NULL
)

Member [Measures].[Color] as 
IIF(
    [Dimension A].[Color Id].CurrentMember is [Dimension A].[Color Id].[All],
    [Dimension B].[Color Id].CurrentMember.Name
    [Dimension A].[Color Id].CurrentMember.Name
)

Select [Measures].[Color] on 0,  
NonEmpty(
    [Dimension A].[Color Id].[Color Id].Members * [Dimension B].[Color Id].[Color Id].Members,
    [Measures].[SameColor]
)
+
NonEmpty(
    [Dimension A].[Color Id].[Color Id].Members * [Dimension B].[Color Id].[All],
    [Measures].[OnlyAColor]
)
+
NonEmpty(
    [Dimension A].[Color Id].[All] * [Dimension B].[Color Id].[Color Id].Members,
    [Measures].[OnlyBColor]
) on 1
From [YourCube]