在同一 Power BI 可视化对象中混合不同的时间粒度

原创:      2024-04-09 14:25


本文翻译自Mateusz Mossakowski的文章—《Mixing different time granularities in one Power BI visual》来源:Medium 本文将阐述如何使最终用户能够在Power BI矩阵中并行地比较不同时间粒度的不同度量。



家具销售分析

额外要求

除了引言中提到的主要要求外,还有另外两项要求。首先,我应该以一种方式组织度量,使同一类别中的度量共享一个公共标头,以获得更好的可读性。例如,像“成本”和“成本IYA”这样的度量应该分组在“成本”标题下。其次,在处理一组产品类别时,重点在于度量的特定子集,即“成本”和“收入”。相反,对于另一组类别,分析包含“税收”和“收入”的不同子集更有意义。


数据模型和所需调整

本文的初始数据模型非常简单。它包括将日历、产品和商店维度表与销售事实表连接起来。

正如您可以观察到的,时间粒度的基本变化不是由原始事实数据时间间隔的差异引起的。相反,它与业务如何感知和分析数据有关。


数据模型

为了满足最初的要求,我选择了利用计算日历层次表。当然,这也可以通过 Power Query 甚至在更上游的阶段实现。


日历维度表

calendar_hierarchy =

VAR _Years =

SELECTCOLUMNS (

Calendar_Dim,

"date_num", calendar_dim[date_num],

"date_num_ya", calendar_dim[date_num] - 10000,

"year", Calendar_Dim[Year],

"year order", Calendar_Dim[Year],

"level", "Year",

"level order", 1,

"element", Calendar_Dim[Year],

"element order",

CALCULATE ( MAX ( Calendar_Dim[Year] ) ) * 100000 + 12000

+ CALCULATE (

COUNTROWS ( Calendar_Dim ),

ALLEXCEPT ( Calendar_Dim, Calendar_Dim[Year] )

)

)

VAR _Quarters =

SELECTCOLUMNS (

ADDCOLUMNS (

Calendar_Dim,

"quarter_end_month_number",

CALCULATE (

MAX ( calendar_dim[month_num] ),

ALLEXCEPT ( Calendar_Dim, Calendar_Dim[quarter_num] )

)

),

"date_num", calendar_dim[date_num],

"date_num_ya", calendar_dim[date_num] - 10000,

"year", Calendar_Dim[Year],

"year order", Calendar_Dim[Year],

"level", "Quarter",

"level order", 2,

"element", calendar_dim[year_quarter],

"element order",

[quarter_end_month_number] * 1000

+ CALCULATE (

COUNTROWS ( Calendar_Dim ),

ALLEXCEPT ( Calendar_Dim, calendar_dim[quarter_num] )

)

)

VAR _Months =

SELECTCOLUMNS (

Calendar_Dim,

"date_num", calendar_dim[date_num],

"date_num_ya", calendar_dim[date_num] - 10000,

"year", Calendar_Dim[Year],

"year order", Calendar_Dim[Year],

"level", "Month",

"level order", 3,

"element", calendar_dim[year_month_name],

"element order",

CALCULATE ( MAX ( calendar_dim[month_num] ) ) * 1000

+ CALCULATE (

COUNTROWS ( Calendar_Dim ),

ALLEXCEPT ( Calendar_Dim, calendar_dim[month_num] )

)

)

VAR _Result =

UNION ( _Years, _Quarters, _Months )

RETURN

_Result


日历层次表


为了确保准确地计算calendar_hierarchy元素列和任何日历维度属性的年前度量,我按照下面概述的模式对DAX公式进行了改进。


认识到需要每季度显示成本度量,每年显示税收和收入度量,我发现理想的方法是将前面提到的日历层次表、计算组逻辑和不连接的组别表表结合起来。


组别表


计算组

但是,仅凭这一点还不能满足最终标准。为了解决这个问题,我决定引入一个类别组表(并将其与产品维度表和组别表相链接)。该表包括所有可能的产品类别组合,以及相应的最具商业意义的度量组。例如,"床 "类别主要通过成本和收入进行评估,而 “长凳”类别则通过税收和收入进行评估。



建立最终数据模型和矩阵

下面是最终确定的数据模型结构。


最终数据模型

考虑到计算组优先于可视化中使用的任何度量(注意,我并没有使用 SELECTEDMEASURER() 函数,而是直接引用了特定的度量),我创建了一个最基本的 DAX 度量,用于矩阵中。


矩阵设置


作为最后的补充,我还对索引与一年前的度量应用了独特的格式(如下面的示例所示)。这是通过在计算项中使用格式字符串表达式实现的。

CALCULATIONITEM "Cost IYA" =

IF (

SELECTEDVALUE ( groups[Group] ) = "Cost"

&& SELECTEDVALUE ( calendar_hierarchy[level] ) = "Quarter",

[Cost IYA]

)

FormatString = VAR _sign = IF( [Cost IYA] < 100, " ", " " ) VAR _result = _sign & "#,#0.0" RETURN _result

Ordinal = 1





如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。




长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~


客户案例

按行业 按部门

线上课程

课程直通 讲师介绍

官方微信

联系我们

北京

13811982114
agileex@agileex.com

北京市朝阳区博雅国际中心A座601

上海

13811982114
agileex@agileex.com

上海市静安区沪太路453号302室

Copyright © 2022 北京敏捷艾科数据技术有限公司agileex.com - 京ICP备16008845号-1