【问题标题】:Mdx union between different dimensions不同维度之间的mdx union
【发布时间】:2017-04-08 19:08:16
【问题描述】:

我有一个模型中有两个不同维度的情况。维度 A 具有 ColorId、FirstColor 和 SecondColor。维度 B 具有 ColorId 和 Firstcolor。我正在尝试从两个不同的维度获取完整的 colorId 列表。请记住,这个 mdx 需要在 ssrs 中使用。

维度 A

ColorId     FirstColor    SecondColor
T0z17       Blue           Green
T0lqa       Red            Yellow

维度 B

ColorId     FirstColor
T201k       Black
Tph1v       Orange

预期输出(仅 1 列)

ColorId
T0z17
T0lqa
T201k
Tph1v

【问题讨论】:

  • 这对 SSAS 来说是一项非常罕见的任务。 OLAP 背后的想法是仅提供具有不同值的维度。这是可能的,但最简单的方法是使用 SQL 查询从 DWH 获取结果。
  • 明确地说,您希望在维度 A 和维度 B 中出现相同的颜色?
  • @greggalloway 不,它不一定必须具有相同的颜色。只是列名和数据类型。颜色 ID 也将采用相同的格式
  • @Danylo Korostil 在 ssrs 中有什么办法吗?我不希望为此添加单独的维度。我不能使用 sql 查询,因为我们的要求只能使用表格模型。更喜欢使用 ssrs 或 mdx
  • 我不是 SSRS 专家,但很可能您必须创建两个数据集(A、B 维度值)并在那里重用 Lookup() 函数作为连接选择。然后得到不同的值。

标签: reporting-services ssas union mdx ssas-tabular


【解决方案1】:

由于 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]

【讨论】:

  • 如果 Dim A 和 Dim B 使用了不同的颜色键值,所以红色是 A 中的 101 而 B 中的 102(完全可能),那么 LinkMember 将不起作用
  • 是的,你是对的。在这种情况下,您可以使用名称重用 StrToMember() 函数。我们不知道,我只是想说明不同的逻辑。
  • (upped) 我真的很喜欢 NonEmpty(....,[Measures].[SameColor]) 的重复数据删除技巧。
【解决方案2】:

试试这个联合查询:

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 的代码并添加了一个独特的概念。
  • @Danylo - + 运算符在执行联合时删除重复项
  • @whytheq 有趣。不知道那个。不幸的是,它不会跨维度进行重复数据删除。幸运的是 Mutai 澄清了重复数据删除是不必要的。
  • @whytheq {[Dimension A].[Color Id].[Black] * [Dimension B].[Color Id].[All]} + {[Dimension A].[Color Id] .[All] * [Dimension B].[Color Id].[Black]} 将返回两个 Black 成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2016-06-21
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多