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]
结果
假设我有一个包含销售事实 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]
结果