在介绍星形结构和powerbi最佳实践的时候,通常会被问到如何在同一个模型中处理预算和实际的问题?如果两者的粒度不一样怎么处理?通常我们不能通过简单的模型和关系处理这个问题,这需要复杂的DAX计算。但是这里的解决方案是,我们可以通过简单的模型解决这个问题!下面我们会通过一个案例来介绍解决过程,使用简单模型如何处理预算和实际粒度不同的问题。
销售的星形模型
事实表包含了发生的业务,其中保存了数值和可聚集的数值。下面这个FactResellerSales表就是一个事实表,DimProduct,DimDate,DimSalesTerritory,DimEmployee表。
建立模型的步骤:
1.把数据表加载到模型中
2.选择对于的表
3.移除DimSalesTerritory 和 DimEmployee之间的关系
4.把FactResellerSales 和 DimEmployee的关系设为活动的
5.使用FactResellerSales中的OrderDateKey和DimDate表的DateKey建立关系
上面这样的模型就是一个典型的星形模型。这个模型可以很好的处理销售相关的问题。但是,当我们要把另外一个不同粒度的表格添加到模型中的时候,似乎建立模型就有些困难。
销售指标:一个粒度不同的表
举个栗子,这里我们使用销售指标来替代预算表,也是和业务表是不同粒度的。概念是一样的。我们要把一个粒度不同的表添加到模型中。销售指标表记录的是每个员工每个季度的销售指标数值。粒度是每员工每季度,而销售表的粒度是每员工每天每地区每产品。
连接两个不同粒度的表的难点:
如果你要对着两种表(指标和实际)添加到星形模型中,那么一般会遇到下面着两个问题:
1.如何把指标表连接到日期表?
2.如果我们建立了一个季度的维度表,那么如何把这个表和日期表关联?会形成一个雪花模型?
我们的目标是建立一个简单的模型来解决这个问题,也还是使用星形模型
连接指标表和日期表
虽然这里我们的销售指标表使用的粒度是基于季度的,我们还是可以把它连接到日期表。这样的方法可以避免额外的维度表以及产生雪花模型。有个需要考虑的是,我们要对每个季度确定一个默认的日期。例如,我们可以把每个季度的第一天设置为这个日期值。
要达到这个目标,我们需要在指标表建立一个列,下面的图中可见,我们使用了YYYYMMDD的格式。
通过以下步骤可以建立下面的列:
1.基于季度值,建立月份值
2.用月的第一天建立自定义列。
要建立季度一个月的值,我们使用下面着公式即可以完成:
calculation of ((<quarter-1>*3)+1)
[图片上传中...(image.png-aa0d4d-1565855207069-0)]
这个计算我们放在Power Query Editor中完成。
第二步就是在这个基础上建立一个DateKey列。
这里,我们要确保的是,月份值都是两位的长度,通过三个步骤可以完成:1.把值转换为文本 2.对该列添加前缀“0” 3.提取该列右边的两个位置的值。
把数值类型转换为文本:
把列添加前缀:
添加“0”作为前缀:
提取字符串末尾两位字符:
结果是这样:
现在,我们已经得到了我们需要的最后的步骤是建立一个自定义列,把年月日连接起来
然后把DateKey的值转换整数,我们现在可以把其他中间过程的列给删除了。
这里我们没有介绍其中的详细步骤,因为实际中,各自的数据不一定就是季度的粒度,然后对于日期的格式,可能也是不同的版本。无论使用什么方法,主要的目标就是让我们的表可以直接连接到日期维度表,而不同新增其他的维度。
星形模型无处不在
在对指标表添加了DateKey后,我们可以通过它连接到日期表和employee表,这里我们依旧是星形模型。
这里我们不需要使用双向的关系,或者把一个维度连接到另外一个维度。这个模型可以轻松解决我们关于预算和实际的问题。
案例分析
下面简单的展示一些分析的案例,我们从处理实际和预算的场景中,建立了一些指标和报表。所有这些工作都不需要特别的DAX函数计算以及使用双向的关系等。之所以能这样实现,是基于正确的建立了数据模型。
DAX案例指标
这里我们只建立了两个计算,很简单,分别是bud vs act:
以及Bud vs Act %:
报表案例
建立了如下这样的案例:
从Employee角度:
以及这个通过上面两个页面下钻后的详情页:
这个模型的优点
这里,我们展示了一个处理预算和实际情况的完整数据模型。这个模型继承了星形模型的全部优点,包括但是不限于如下:
1.不需要额外的建立关系。只需要在事实表和维度表之间建立简单的关系就可以了。
2.不需要使用双向的关系。
3.不需要使用多对多关系。
4.不需要使用复杂的DAX函数计算。
5.处理计算需求的时候,性能上会更优秀。
改进的地方
这模型仍然还有一些地方可以进行改进,例如,如果你要在更低的一个粒度上分析数据,你需要额外的一些考虑。例如,如果你需要在“天”的级别上分析数据(注意,我们的指标数据是基于季度的,而不是“天”),然后,你需要一些其他的计算。这个我们会在另外的时间探讨以下。