在 MDX 中对行轴和列轴交叉连接的度量进行排序
Sort measures where row and column axis are cross-joined in MDX
我有一个 table,其中行轴中有两个维度交叉连接,两个维度加上列轴中的度量交叉连接。例如:
我想对特定列的行进行排序,以图像为例我想对所有行进行排序,以便对 France -> apples -> avg_sales 下的行进行排序。例如:
当只有一堆度量作为列(没有交叉连接)和许多不同的维度在行轴上交叉连接时,我已经能够找到很多关于如何执行此操作的示例,但我无法找到任何地方如何解决这种特殊情况。
我尝试了如下操作:
SELECT CrossJoin(
[Country].[Country].members,
CrossJoin(
[Product Category].[Product].members,
{[avg_sales]}
)
) on columns,
Order(
Filter(
CrossJoin(
[Date].[Year].Members,
[Date].[Month].Members
),
NOT IsEmpty(avg_sales)
),
CrossJoin(
[Country].[Country].[France],
CrossJoin(
[Product Category].[Product].[apples],
{[avg_sales]}
)
),
BDESC
) ON ROWS
FROM [Main Cube]
但是 MDX Order() 函数签名不允许它,它抱怨说:
Mondrian Error: No function matches signature 'Order(<Set>, <Set>, <Symbol>)'
根据文档 https://mondrian.pentaho.com/documentation/mdx.php
只有两个功能:
<Set> Order(<Set>, <Value>, <Symbol>)
<Set> Order(<Set>, <Value>)
Order函数一定是这样的
Order(
Filter(
CrossJoin(
[Date].[Year].Members,
[Date].[Month].Members
),
NOT IsEmpty(avg_sales)
) *
CrossJoin(
[Country].[Country].[France],
CrossJoin(
[Product Category].[Product].[apples],
{[avg_sales]}
)
),
BDESC
)
行轴上的这个 MDX 表达式可以解决问题:
ORDER(
CrossJoin([Date].[Year].Members, [Date].[Month].Members),
([Measures].[avg_sales], [Product Category].[Product].[apples]),
BASC
)
如果您想按销售额对月份进行排序但仍将年份放在一起,那么您可以这样做:
ORDER(
CrossJoin([Date].[Year].Members, [Date].[Month].Members),
[Date].[Year].CurrentMember.ORDERKEY,
BASC,
([Measures].[avg_sales], [Product Category].[Product].[apples]),
BASC
)
您甚至可以按所选国家/地区的平均销售额和列轴上的水果对行进行排序。
有 Pentaho EE 的免费试用版,其中包括 Mondrian 上的 OLAP 客户端(Pentaho Analyzer),可以生成这些类型的 MDX 表达式。您可以使用他们的数据源向导来加载您的数据、构建一些报告并研究 MDX 以了解如何使用 ORDER MDX 函数。
我有一个 table,其中行轴中有两个维度交叉连接,两个维度加上列轴中的度量交叉连接。例如:
我想对特定列的行进行排序,以图像为例我想对所有行进行排序,以便对 France -> apples -> avg_sales 下的行进行排序。例如:
当只有一堆度量作为列(没有交叉连接)和许多不同的维度在行轴上交叉连接时,我已经能够找到很多关于如何执行此操作的示例,但我无法找到任何地方如何解决这种特殊情况。
我尝试了如下操作:
SELECT CrossJoin(
[Country].[Country].members,
CrossJoin(
[Product Category].[Product].members,
{[avg_sales]}
)
) on columns,
Order(
Filter(
CrossJoin(
[Date].[Year].Members,
[Date].[Month].Members
),
NOT IsEmpty(avg_sales)
),
CrossJoin(
[Country].[Country].[France],
CrossJoin(
[Product Category].[Product].[apples],
{[avg_sales]}
)
),
BDESC
) ON ROWS
FROM [Main Cube]
但是 MDX Order() 函数签名不允许它,它抱怨说:
Mondrian Error: No function matches signature 'Order(<Set>, <Set>, <Symbol>)'
根据文档 https://mondrian.pentaho.com/documentation/mdx.php 只有两个功能:
<Set> Order(<Set>, <Value>, <Symbol>)
<Set> Order(<Set>, <Value>)
Order函数一定是这样的
Order(
Filter(
CrossJoin(
[Date].[Year].Members,
[Date].[Month].Members
),
NOT IsEmpty(avg_sales)
) *
CrossJoin(
[Country].[Country].[France],
CrossJoin(
[Product Category].[Product].[apples],
{[avg_sales]}
)
),
BDESC
)
行轴上的这个 MDX 表达式可以解决问题:
ORDER(
CrossJoin([Date].[Year].Members, [Date].[Month].Members),
([Measures].[avg_sales], [Product Category].[Product].[apples]),
BASC
)
如果您想按销售额对月份进行排序但仍将年份放在一起,那么您可以这样做:
ORDER(
CrossJoin([Date].[Year].Members, [Date].[Month].Members),
[Date].[Year].CurrentMember.ORDERKEY,
BASC,
([Measures].[avg_sales], [Product Category].[Product].[apples]),
BASC
)
您甚至可以按所选国家/地区的平均销售额和列轴上的水果对行进行排序。
有 Pentaho EE 的免费试用版,其中包括 Mondrian 上的 OLAP 客户端(Pentaho Analyzer),可以生成这些类型的 MDX 表达式。您可以使用他们的数据源向导来加载您的数据、构建一些报告并研究 MDX 以了解如何使用 ORDER MDX 函数。