使用 AVERAGE() 计算的 DAX 度量的 MDX 语法
MDX syntax for DAX measures calculated with AVERAGE()
我在 Excel 中有以下表达式可以正常工作。
=CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10,
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E&"]
),
[Measures].[Product Review Count]
)
)",
"Top 10 to date")
使用以下 DAX 公式的产品评论计数度量。
Product Review Count:=COUNTROWS(ProductBV)
但是,当我将 DAX 度量更改为使用 AVERAGE 函数(产品平均评论)的度量时,CUBESET 函数无法正常工作。它在 CUBESET 中的项目数量仍然正确,但是当我使用 CUBERANKEDMEMBER(1-10) 时,它没有显示按平均评分排名前 10 位的产品。
Product Avg Review:=AVERAGE(ProductBV[Rating])
'Not working correctly' 表达式如下:
=CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10,
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E&"]
),
[Measures].[Product Avg Review]
)
)",
"Top 10 to date")
总而言之,我的数据很简单。我有一个数据 table 连接到日历 table,其中包含我的产品名称、评级、日期和评论状态。
在我的控制面板中,我的日期 ($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 |
+-----------------+-------------------+------------+----------------+
谁能告诉我为什么会这样以及如何解决它?
这会产生一组 CUBESET
。
一套有一个计数,所以我可以理解 COUNTROWS
将正常运行。
如果您将一组成员输入 AVERAGE
,它会根据哪个度量取平均值?这似乎是非决定性的?
您能否将 ProductBV[Rating]
返回的集合提供给后续的多维数据集函数,该函数指定您想要计算平均值的度量值?
当我看到您的问题时,我想知道如果您在 PowerPivot 中建模,为什么还要使用 Excel 公式和控件来创建仪表板。 PowerPivot 可让您以更稳健可靠的方式分析和可视化数据。
您的初始方法非常复杂,考虑到以下因素,很难维持:
- 每当将新产品添加到您的来源时,您都必须编辑仪表板。
- Excel 函数很容易出错,因为它们需要一个特定的值作为参数,而用户可能会修改它而导致错误。
- PowerPivot 计算比 Excel 函数执行得更快,特别是对于大型数据集。
- 您无法向用户提供太多与数据的交互。
这是我使用 Pivot Table 连接到您的 PowerPivot 模型构建的仪表板。
为了构建此仪表板,我使用了四种 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] )
)
)
在措施奏效的情况下,您可以创建两个枢轴 Table,一个用于显示积极推动者,另一个用于显示消极推动者。
Note my Excel UI is in spanish, I hope you don't get stuck with this. Just follow the instructions and search in Google, there are plenty resources about Pivot Tables.
在 Rows
窗格中添加 Product Name
,在 Values
中添加 Last Week
、This Week
和 Positive Movement
或 Negative Movement
(根据您正在构建的 Pivot Table)措施。
一旦你建立了 table,你必须获得 TOP X Product Names
。
在每个 Pivot Table 中单击行标记图标过滤器(以下设置适用于 Positive Movers Pivot Table):
并使用这些设置:
在过滤时将 Positive Movement
更改为 Negative Movement
以获取负面运动中的前 5 Product Names
table。
虽然您可以纯粹在 DAX 中获得前 5 名产品名称,但我认为最好使用 Pivot Table 筛选器选项,让它动态显示任意数量的顶级产品(可能是新的将来的要求)而无需修改基础 DAX。
然后你只需要添加条件格式就大功告成了。
如果这有帮助,请告诉我。
我在 Excel 中有以下表达式可以正常工作。
=CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10,
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E&"]
),
[Measures].[Product Review Count]
)
)",
"Top 10 to date")
使用以下 DAX 公式的产品评论计数度量。
Product Review Count:=COUNTROWS(ProductBV)
但是,当我将 DAX 度量更改为使用 AVERAGE 函数(产品平均评论)的度量时,CUBESET 函数无法正常工作。它在 CUBESET 中的项目数量仍然正确,但是当我使用 CUBERANKEDMEMBER(1-10) 时,它没有显示按平均评分排名前 10 位的产品。
Product Avg Review:=AVERAGE(ProductBV[Rating])
'Not working correctly' 表达式如下:
=CUBESET("ThisWorkbookDataModel",
"TopCount(
[ProductBV].[Product Name].Children,10,
sum(
(
[Calendar].[Week Ending].[All].[1/6/2013]:[Calendar].[Week Ending].[All].["&TEXT($E,"m/d/yyyy")&"],
[ProductBV].[Moderation Status (ALL)].[All].["&$E&"]
),
[Measures].[Product Avg Review]
)
)",
"Top 10 to date")
总而言之,我的数据很简单。我有一个数据 table 连接到日历 table,其中包含我的产品名称、评级、日期和评论状态。
在我的控制面板中,我的日期 ($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 |
+-----------------+-------------------+------------+----------------+
谁能告诉我为什么会这样以及如何解决它?
这会产生一组 CUBESET
。
一套有一个计数,所以我可以理解 COUNTROWS
将正常运行。
如果您将一组成员输入 AVERAGE
,它会根据哪个度量取平均值?这似乎是非决定性的?
您能否将 ProductBV[Rating]
返回的集合提供给后续的多维数据集函数,该函数指定您想要计算平均值的度量值?
当我看到您的问题时,我想知道如果您在 PowerPivot 中建模,为什么还要使用 Excel 公式和控件来创建仪表板。 PowerPivot 可让您以更稳健可靠的方式分析和可视化数据。
您的初始方法非常复杂,考虑到以下因素,很难维持:
- 每当将新产品添加到您的来源时,您都必须编辑仪表板。
- Excel 函数很容易出错,因为它们需要一个特定的值作为参数,而用户可能会修改它而导致错误。
- PowerPivot 计算比 Excel 函数执行得更快,特别是对于大型数据集。
- 您无法向用户提供太多与数据的交互。
这是我使用 Pivot Table 连接到您的 PowerPivot 模型构建的仪表板。
为了构建此仪表板,我使用了四种 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] )
)
)
在措施奏效的情况下,您可以创建两个枢轴 Table,一个用于显示积极推动者,另一个用于显示消极推动者。
Note my Excel UI is in spanish, I hope you don't get stuck with this. Just follow the instructions and search in Google, there are plenty resources about Pivot Tables.
在 Rows
窗格中添加 Product Name
,在 Values
中添加 Last Week
、This Week
和 Positive Movement
或 Negative Movement
(根据您正在构建的 Pivot Table)措施。
一旦你建立了 table,你必须获得 TOP X Product Names
。
在每个 Pivot Table 中单击行标记图标过滤器(以下设置适用于 Positive Movers Pivot Table):
并使用这些设置:
在过滤时将 Positive Movement
更改为 Negative Movement
以获取负面运动中的前 5 Product Names
table。
虽然您可以纯粹在 DAX 中获得前 5 名产品名称,但我认为最好使用 Pivot Table 筛选器选项,让它动态显示任意数量的顶级产品(可能是新的将来的要求)而无需修改基础 DAX。
然后你只需要添加条件格式就大功告成了。
如果这有帮助,请告诉我。