从具有不同粒度级别的事实表计算叶级别的父值

时间:2019-02-26 15:19:36

标签: ssas powerbi dax powerpivot

我不确定数据模型是否适合我要计算的数据,但是我想首先根据提供的数据集格式尝试一下。

数据提供者提供的数据集类似于您可以在github上获得的population world bank dataset

enter image description here

它包含国家/地区级别的人口,也包含世界银行current classification(按世界银行网站上的Excel-File)的地区或经济组。

尽管最好的做法是分离出不同的谷物以获得更好的事实表,但在我的真实情况下,事实表包含整个数据集在不同谷物级别的子集。由于成本原因,我们不购买每片叶子。

对于该示例,它看起来像这样的列表:选择了一些国家和经济区域,应该一起计算。

enter image description here

我正在寻找的是使用DAX(Power Pivot / SSAS 2017或Power BI)来计算孩子与父级的人口比例,如果透视表仅包含叶成员,则 / strong>。

网络上有几个示例,介绍了如何使用DAX计算层次结构。但是,我发现的只是一个逻辑层次结构和事实表:
  -最低粮食水平的事实表
  -具有计算列以构建层次结构的维度表(PATH(),...)

我根据Alberto Ferrari的solution建立了层次结构。

enter image description here

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] ) )
        )
    )
)

只要在数据透视表的行上使用层次结构,就可以根据需要计算比率:
enter image description here

例如,中等收入国家/地区中的国家占世界人口的75%(2010年),中低收入国家/地区中的国家占世界总人口的53%。

但是,如果我仅使用国家/地区字段而不是层次结构,则上述度量将不会计算任何值(可能是由于[BrowseDepht]和[NodeDepth]度量)。

我找不到一种方法来将孩子的父母的人口价值带入孩子的水平,因为该值不是所有孩子的总和。没有该值,无法计算比率。

任何线索将不胜感激。

enter image description here

在层次结构之外进行计算的能力使可视化成为可能(例如,在图表上划分一个国家)。

1 个答案:

答案 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 )
                        )
                    )
                )
            )
        )
    )
)

enter image description here

但是,此措施尚不能移植。如果放置在初始层次结构中,则不会计算带有子级的级别(由于具有HASONEVALUE函数,这对于防止DAX错误是必需的)。 enter image description here

可能有人会知道如何在没有HASONEVALUE函数的情况下移植最后一个度量“ RatioToParent 2”。