MDX - 每个子组的前 N ​​个元素

MDX - Top N elements of every subgroup

假设我有一个包含销售事实 table 和 3 个维度的多维数据集:时间(具有年-月-日层次结构)、地理(具有大陆-国家-地区层次结构)和具有某些特征的产品关于销售的产品,我们以品牌为例。

我想做的是根据所选的衡量标准显示前 N 个品牌,在本例中为平均销售额(已作为已售产品的总 sales/number 在立方体中),对于每个地区和每个月。

为了清楚起见,我还需要显示国家和年份。

我到处都在寻找这个问题的解决方案,我接近了但不完全。希望有人能帮我解决一下。

所以我在以下查询中使用了 generate 和 topcount,但问题是 topcount 计算的是整个数据集中的 N 个最畅销品牌,而不是每个 地区和月份 亚群。然后将这个前 N 个应用到每个子组。

WITH SET [Top N Brands] AS
    Generate([Geography].[Region].Children,
    TopCount(Geography].[Region].CurrentMember * [Gpu Product].[Brand].[Brand].MEMBERS,
            5, ([Measures].[averageSales])))
SELECT {[Measures].[averageSales]} ON COLUMNS,
    NON EMPTY ( [Time].[Year].[Year],
                [Time].[Month].[Month],
                [Geography].[Country].[Country],
                [Top N Brands])  ON ROWS
FROM [Cube]

所以我得到这个,全球排名前 5 的品牌分布在这些地区,如果在那里销售:

但我应该得到每个地区不同的前 5 名:

我错过了什么?

您需要使用排名。看看下面的例子。我正在使用示例 Adventure Works Db,在这里我列出了每个国家/地区的每个产品类别,根据互联网销售量排名前三的子类别。

WITH 
MEMBER [Measures].[Internet Sales Amount Rank] AS
RANK( ([Customer].[Country].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].CurrentMember),
ORDER( ([Customer].[Country].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].[Subcategory].Members) , [Measures].[Internet Sales Amount], BDESC)
) 

select 
non empty 
([Measures].[Internet Sales Amount])
on columns
,
non empty
([Customer].[Country].[Country],
[Product].[Category].[Category],
filter([Product].[Subcategory].[Subcategory],[Measures].[Internet Sales Amount Rank]<4))

on rows 
from [Adventure Works]

结果