具有 2 个度量值组(与维度具有不同关系)的多维数据集在报表中返回过多维度成员

Lau*_*nce 4 sql-server ssas cube dimensional-modeling

我有一个包含来自零售业务的库存盘点数据的多维数据集。它有 2 个度量组 - 一个包含在每个盘点批次中计算的库存单位数(与产品、批次和时间维度相关),另一个包含产品价格(仅与产品维度相关)。

price 度量组中的度量使用 Min 和 Max 运算符(即它们显示 Products 维度的选定成员的最低或最高价格)。

我似乎已经正确配置了多维数据集和维度(价格度量按预期显示)......除了以下情况:

如果我在 Excel 中查询多维数据集并按时间和批次获取单位,我会看到预期的结果(见下图,按时间 = 2015 过滤,并隐藏没有数据的行),即仅包含所选单位事实数据的批次时间维度成员。

按时间和批次划分的单位

如果我现在添加一个价格度量(不更改任何过滤器),Units total 不变(如预期),但我现在可以看到Batch 维度中的每个成员(见下图)。这对最终用户来说是一个问题,因为他们只想查看先前选择的批次中产品的价格。

在此处输入图片说明

从技术角度来看,这是有道理的 - 价格事实与时间无关,因此不能像单位那样被我的时间过滤器过滤。

我可以做些什么(在多维数据集设计或 Excel 中)消除给定过滤器没有单位的 Batch 成员?注意:我无法让用户编写 MDX 查询 - 报告构建需要保持“点击”!

编辑 27/1(添加额外的屏幕截图以说明根据 TomV 的回答设置 Ignore Unrelated Dimensions = False 的奇怪副作用)

在此处输入图片说明

Tom*_*m V 7

正如您正确指出的那样,当您尝试跨维度显示度量时会发生这种情况,而这些维度与其没有关系。

你基本上有 2 个选择

  1. IgnoreUnrelatedDimensions
  2. 使用MDX解决方案

我建议你尝试的IgnoreUnRelatedDimensions第一次,因为这些措施将得到更好的聚集,并且NonEmptyCrossJoins将能够从利益Bitmap Indexes使用时Attribute Relationships被定义。

由于可能存在性能问题,MDX 解决方案更像是最后的手段,您还需要为您拥有的每个度量定义一个计算度量。MDX 解决方案很可能要么很复杂,要么会弄乱您的总数/显示不正确的数据。

忽略无关维度

在查看 Adventureworks 2012 多维数据集时,您会遇到这种情况,即员工未链接到“Internet 销售”,而是链接到“经销商销售”。

浏览多维数据集时,结果与您从员工维度的两个度量组中添加度量时的结果相同。

在此处输入图片说明

您可以通过将IgnoreUnrelatedDimensions属性设置为Falseon来解决此问题Measure Group

在此处输入图片说明

重新处理多维数据集并刷新浏览器后,结果现在如下所示:

在此处输入图片说明

但是有一些警告,例如设置问题 DefaultMember

如果DefaultMember不是不All level相关维度的属性之一,则不会获得聚合数据,因为即使默认成员未包含在数据透视表中,它仍然充当过滤器:

例如在DefaultMember像这样在员工维度的性别属性上设置属性之后。

在此处输入图片说明

这是报告中不包含切片器时的结果。当然,您希望在此处查看总数:

在此处输入图片说明

我似乎记得其他一些边缘情况,calculated measures但我不记得具体情况。

MDX解决方案

如果您遇到任何边缘情况,您将不得不求助于MDX@GregGalloway 发布的解决方案,但这最终可能会变得乏味且非常特定于单个报告或用例:

CREATE MEMBER CURRENTCUBE .[Measures].[Max Current CP With Units] AS
  IIf (
    NOT IsEmpty ( [Measures].[Units] ),
    [Measures].[Max Current CP],
    NULL
  ) ;
Run Code Online (Sandbox Code Playgroud)

该解决方案的缺点是您会弄乱总计的外观并可能显示不正确的数据,但这在您使用 MIN/MAX 聚合的特定价格信息情况下可能是可以接受的,但会完全破坏总和,并且可能会显示向您的用户提供虚假数据。

例如,在运行此查询时

WITH MEMBER [Measures].[Filtered internet order count] as
'
IIf (
    NOT IsEmpty ([Measures].[Reseller Order Count] ),
    [Measures].[Internet Order Count],
    NULL)
'
SELECT {[Measures].[Filtered internet order count],[Measures].[Reseller Order Count]} ON 0,
[Employee].[Employees].allmembers ON 1
FROM [Adventure Works]
Run Code Online (Sandbox Code Playgroud)

产生这个结果

在此处输入图片说明

这看起来同样奇怪,因为总数与每个成员相同。但这在您的最小/最大定价的特定情况下可能是可以接受的,我认为它主要显示虚假数据,因为这些员工没有互联网销售。

我想如果您控制报告,那将是可能的。对于您编辑中添加的数据透视表,我想它会产生不错的结果。