【问题标题】:MDX syntax for DAX measures calculated with AVERAGE()使用 AVERAGE() 计算的 DAX 度量的 MDX 语法
【发布时间】:2016-10-27 21:06:22
【问题描述】:

我在 Excel 中有以下表达式可以正常工作。

=CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10, 
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E$2,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E$3&"]
),
[Measures].[Product Review Count]
)
)",
"Top 10 to date")

使用以下 DAX 公式衡量产品评论计数。

Product Review Count:=COUNTROWS(ProductBV)

但是,当我将 DAX 度量更改为使用 AVERAGE 函数(Product Avg Review)的度量时,CUBESET 函数无法正常工作。它在 CUBESET 中仍然有正确数量的项目,但是当我使用 CUBERANKEDMEMBER(1-10) 时,它没有显示按平均评分排名前 10 位的产品。

Product Avg Review:=AVERAGE(ProductBV[Rating])

下面的“工作不正常”表达式:

 =CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10, 
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E$2,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E$3&"]
),
[Measures].[Product Avg Review]
)
)",
"Top 10 to date")

总而言之,我的数据很简单。我有一个数据表连接到包含我的产品名称、评级、日期和评论状态的日历表。

用户可以通过下拉菜单更改我的仪表板中的日期 ($E$2) 和审核状态 ($E$3)。

+-----------------+-------------------+------------+----------------+
| Submission Date | Moderation Status | Product ID | Overall Rating |
+-----------------+-------------------+------------+----------------+
| 10/23/2016      | APPROVED          | Product 1  |              5 |
| 10/23/2016      | APPROVED          | Product 2  |              5 |
| 10/23/2016      | APPROVED          | Product 3  |              5 |
| 10/23/2016      | REJECTED          | Product 3  |              3 |
| 10/23/2016      | REJECTED          | Product 4  |              3 |
+-----------------+-------------------+------------+----------------+

谁能告诉我为什么会这样以及如何解决它?

【问题讨论】:

  • 我很好奇需要使用 Excel 函数。为什么不在 PowerPivot 模型中使用 DAX 进行计算?如果您提供有关您的模型的详细信息,我们可以给您一些建议。
  • 我使用 Excel 功能的原因是在仪表板上显示排名前 10 位的产品,按每周平均评分的变化量。因为我有数百种产品,所以我只希望显示前 10 名,而不是按评级变化量排序的大表。很高兴在 DAX 中完成这一切(并提供模型详细信息),但我不确定在不使用 Excel 函数的情况下这种方法将如何实现。
  • 在 DAX 中,您可以轻松获得特定日期范围内前 10 种产品的平均值。如前所述,如果您提供模型和示例数据,我们可以给您一些建议。
  • 哇 - 很高兴知道。什么方法最好把这个模型寄给你?需要一个小时来创建虚拟数据,因为它是客户端敏感的。谢谢!
  • 只需编辑您的问题以包含这些详细信息。检查this 帖子。您还可以提供从任何云存储服务、驱动器、保管箱等下载 excel 文件的链接。

标签: excel mdx powerpivot


【解决方案1】:

这会产生一个集合CUBESET

一个集合有一个计数,所以我可以理解COUNTROWS 将正常工作。

如果您将一组成员输入AVERAGE,它的平均值是哪个度量?这似乎是非决定性的?

您能否将ProductBV[Rating] 返回的集合输入到后续的多维数据集函数中,该函数指定您希望获得平均值的度量?

【讨论】:

  • 感谢您的回复。对于您的前两个 cmets,您说我的公式返回一个 CUBESET 并且 COUNTROWS 正常工作是正确的。我不太明白您在第三条评论中的意思(对 MDX 来说仍然很新)。 [Product Avg Review] 是我对 [Product Name] 的 [Product Rating] 的平均值。对于您的最后一条评论,您是否建议嵌套我的集合,以便外部排名靠前,内部拉动我的产品平均评论按日期范围和审核状态过滤?如果有帮助,我会对我的帖子进行一些小修改
  • @Chris 好的 - 我的错误 - 所以 AVERAGE(ProductBV[Rating]) 是 DAX?
  • 没错。 Excel 中的多维数据集函数访问 PowerPivot 数据模型。抱歉 - 在我最初的帖子中应该是明确的
  • 对解决方案还有其他想法吗?还是没搞清楚这个……
【解决方案2】:

当我看到您的问题时,我想知道如果您在 PowerPivot 中建模,为什么要使用 Excel 公式和控件来创建仪表板。 PowerPivot 可让您以更强大、更可靠的方式分析和可视化数据。

您的初始方法非常复杂,考虑到以下因素很难维持:

  • 每当有新产品添加到您的来源时,您都必须编辑仪表板。
  • Excel 函数很容易出错,因为它们需要一个特定的值作为参数,而用户可以修改它导致错误。
  • PowerPivot 计算的执行速度比 Excel 函数快,尤其是对于大型数据集。
  • 您无法向用户提供与数据的太多交互。

这是我使用连接到您的 PowerPivot 模型的数据透视表构建的仪表板。

DOWNLOAD THE EXCEL FILE HERE

为了构建这个仪表板,我使用了四个 DAX 度量:

This Week :=
CALCULATE (
        [Product Avg Review],
        FILTER (
            ALL ( Calendar ),
            Calendar[Week Ending] <= MAX ( Calendar[Week Ending] )
        )
    )

Last Week =
    CALCULATE (
        [Product Avg Review],
        FILTER (
            ALL ( Calendar ),
            Calendar[Week Ending]
                <= MAX ( Calendar[Week Ending] ) - 7
        )
    )

Positive Movement :=
    (
        CALCULATE (
            [Product Avg Review],
            FILTER (
                ALL ( Calendar ),
                Calendar[Week Ending]
                    <= MAX ( Calendar[Week Ending] ) - 7
            )
        )
            - CALCULATE (
                [Product Avg Review],
                FILTER (
                    ALL ( Calendar ),
                    Calendar[Week Ending] <= MAX ( Calendar[Week Ending] )
                )
            )
    )
        * -1

Negative Movement :=
    CALCULATE (
        [Product Avg Review],
        FILTER (
            ALL ( Calendar ),
            Calendar[Week Ending]
                <= MAX ( Calendar[Week Ending] ) - 7
        )
    )
        - CALCULATE (
            [Product Avg Review],
            FILTER (
                ALL ( Calendar ),
                Calendar[Week Ending] <= MAX ( Calendar[Week Ending] )
            )
        )

通过措施,您可以创建两个数据透视表,一个用于显示积极推动者,另一个用于显示消极推动者。

请注意,我的 Excel 用户界面是西班牙文,希望您不要被这个卡住。只需按照说明在 Google 中搜索即可,有很多关于数据透视表的资源。

Rows 窗格中添加Product Name,在Values 中添加Last WeekThis WeekPositive MovementNegative Movement(根据您正在构建的数据透视表)度量。

一旦你建立了表格,你必须得到 TOP X Product Names

在每个数据透视表中单击行标记图标过滤器(以下设置适用于正移动数据透视表):

并使用这些设置:

当您过滤以获取负面移动表中的前 5 个Product Names 时,将Positive Movement 更改为Negative Movement

虽然您可以纯粹在 DAX 中获得前 5 名产品名称,但我认为最好使用数据透视表过滤器选项,使其动态地应用于任意数量的顶级产品(未来可能是新的要求),而无需需要修改底层 DAX。

然后你只需要添加条件格式就可以了。

如果这有帮助,请告诉我。

【讨论】:

  • 嘿亚历杭德罗,你的方法很有效!我不想将数据保存在数据透视表中的最初原因是过滤器在我的仪表板上占用了很多空间。但是,我将采用您所做的一切,但保留我的下拉过滤器并对其运行一点 VBA 来过滤数据透视表。这样我就应该能够两全其美。我非常感谢您对这个问题的所有帮助以及您提供的大量文档。非常感谢 - 克里斯!
  • @Chris,我很高兴您设法根据您的需求实施我的解决方案。不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多