Я не уверен, подходит ли модель данных для того, что я хочу вычислить, но я хотел бы сначала попробовать, если это возможно, согласно предоставленному формату набора данных.
Набор данных, предоставленный поставщиком данных, похож на набор данных Всемирного банка , который вы можете получить на github.
Содержит население на уровне страны, а также по регионам или группам экономики в соответствии с действующей классификацией Всемирного банка (файл Excel на веб-сайте Всемирного банка).
Хотя было бы целесообразно разделять разные зерна для лучшей таблицы фактов, в моем реальном случае таблица фактов содержит подмножества всего набора данных на разных уровнях зерна.Мы не покупаем каждый лист по цене.
Для примера это выглядит следующим образом: некоторые страны и регионы экономики выбраны и должны быть рассчитаны вместе.
Мне нужно рассчитать с помощью DAX (Power Pivot / SSAS 2017 или Power BI) коэффициент популяции ребенка по сравнению сродительский уровень, также, если сводная таблица содержит только конечные элементы .
В Интернете есть несколько примеров того, как рассчитать иерархию с DAX.Однако все, что я нашел, было с помощью логической иерархии и таблицы фактов:
- таблица фактов на самом низком уровне зерна
- таблица измерений с вычисленными столбцами для построения иерархии (PATH (), ...)
Я строю иерархию в соответствии с решением от Альберто Феррари.
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]).
Я не могу найти способкак вывести на детский уровень население ваlue родителя, так как значение не является суммой всех дочерних элементов.Без этого значения отношение не может быть вычислено.
Любая подсказка была бы очень признательна.
Возможность вычисления вне пределов иерархии дает возможность визуализации (нарезать некоторые страны нанапример, диаграмма).