我不确定数据模型是否适合我要计算的数据,但是我想首先根据提供的数据集格式尝试一下。
数据提供者提供的数据集类似于您可以在github上获得的population world bank dataset。
它包含国家/地区级别的人口,也包含世界银行current classification(按世界银行网站上的Excel-File)的地区或经济组。
尽管最好的做法是分离出不同的谷物以获得更好的事实表,但在我的真实情况下,事实表包含整个数据集在不同谷物级别的子集。由于成本原因,我们不购买每片叶子。
对于该示例,它看起来像这样的列表:选择了一些国家和经济区域,应该一起计算。
我正在寻找的是使用DAX(Power Pivot / SSAS 2017或Power BI)来计算孩子与父级的人口比例,如果透视表仅包含叶成员,则 / strong>。
网络上有几个示例,介绍了如何使用DAX计算层次结构。但是,我发现的只是一个逻辑层次结构和事实表:
-最低粮食水平的事实表
-具有计算列以构建层次结构的维度表(PATH(),...)
我根据Alberto Ferrari的solution建立了层次结构。
Population wrong:=
IF (
[BrowseDepth] > [MaxNodeDepth];
BLANK ();
SUM ( population[Value] )
)
为了不计算父级的子级,我使用以下措施:
Population w/o aggregation:=
IF (
[BrowseDepth] = [MinNodeDepth];
CALCULATE (
SUM ( population[Value] );
FILTER (
population;
population[Country Code] = CALCULATE (
VALUES ('country'[Country code]);
FILTER (
'country';
'country'[HierarchyDepth] = MIN ('country'[HierarchyDepth])
)
)
)
)
)
RatioToParent:=
IF (
ISFILTERED ( country[Level2] )
&& NOT ( ISFILTERED ( country[Level3] ) );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level2] ) );
IF (
ISFILTERED ( country[Level3] ) && NOT ( ISFILTERED ( country[Level4] ) );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level3] ) );
IF (
ISFILTERED ( country[Level4] );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level4] ) )
)
)
)
只要在数据透视表的行上使用层次结构,就可以根据需要计算比率:
例如,中等收入国家/地区中的国家占世界人口的75%(2010年),中低收入国家/地区中的国家占世界总人口的53%。
但是,如果我仅使用国家/地区字段而不是层次结构,则上述度量将不会计算任何值(可能是由于[BrowseDepht]和[NodeDepth]度量)。
我找不到一种方法来将孩子的父母的人口价值带入孩子的水平,因为该值不是所有孩子的总和。没有该值,无法计算比率。
任何线索将不胜感激。
在层次结构之外进行计算的能力使可视化成为可能(例如,在图表上划分一个国家)。
答案 0 :(得分:0)
我现在找到了部分解决方案来代替此初始措施:
RatioToParent:=IF (
ISFILTERED ( country[Level2] )
&& NOT ( ISFILTERED ( country[Level3] ) );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level2] ) );
IF (
ISFILTERED ( country[Level3] ) && NOT ( ISFILTERED ( country[Level4] ) );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level3] ) );
IF (
ISFILTERED ( country[Level4] );
[Population w/o aggregation]
/ CALCULATE ( [Population w/o aggregation]; ALL ( country[Level4] ) )
)
)
)
在不使用ISFILTERED函数的情况下,我采取了以下措施:
RatioToParent 2:=IF (
HASONEVALUE ( country[Country code] );
DIVIDE (
SUM ( population[Value] );
IF (
VALUES ( country[Level] ) = 1;
BLANK ();
IF (
VALUES ( country[Level] ) = 2;
CALCULATE (
SUM ( population[Value] );
VALUES ( country[Level1] );
FILTER ( ALL ( country ); country[Level] = 1 )
);
IF (
VALUES ( country[Level] ) = 3;
CALCULATE (
SUM ( population[Value] );
VALUES ( country[Level2] );
FILTER ( ALL ( country ); country[Level] = 2 )
);
IF (
VALUES ( country[Level] ) = 4;
CALCULATE (
SUM ( population[Value] );
VALUES ( country[Level3] );
FILTER ( ALL ( country ); country[Level] = 3 )
)
)
)
)
)
)
)
但是,此措施尚不能移植。如果放置在初始层次结构中,则不会计算带有子级的级别(由于具有HASONEVALUE函数,这对于防止DAX错误是必需的)。
可能有人会知道如何在没有HASONEVALUE函数的情况下移植最后一个度量“ RatioToParent 2”。