首先,我想解释一下角色扮演维度的真正含义。然后,我将说明您可以在SSAS表格模型中实施该方法的方式。
当您将维度多次链接到事实表以获取逻辑上独特的角色时,您正在使用角色扮演维度。
关键点是:
1. 您要将事实表多次链接到维。通过将事实表中的多个外键链接到维表中的单个键来定义关系。
2. 每个链接代表一个角色或概念
最受欢迎的角色扮演维度是DimDate和DimTime。是否要查看如何在Power BI中实现角色扮演维度,请单击 这里 和 这里.
注意:该示例来自SQL Server 2012的Microsoft“ AdventureWorksDW”,可能与您自己的数据仓库设计不同。
例如,在销售系统中,您具有诸如FactInternetSales事实表之类的东西,该表具有指向DimDate或DimAddress的多个链接或关系,以实现不同的概念,例如“订购日期”,“装船日期”和“到期日期”。
如您所见,以上所有列显然表示日期的不同含义。在数据仓库设计中,您将看到以下内容:
尽管在关系数据库层中这绝对可以,但是在表格模型中不允许这种关系,那么我们应该怎么做?
让我们看一下SQL Server数据工具(SSDT)中的表格模型,看看直接从SQL Server数据源导入模型时的外观。
· 打开SSDT并创建一个新的Analysis Services表格项目(我假设您知道如何在SSDT中创建一个新项目)
· 单击“从数据源导入”,然后选择“ Microsoft SQL服务器”,然后单击“下一步”
· 输入服务器名称,然后从数据库列表中选择“ AdventureWorksDW”,然后单击“下一步”。
· 输入模拟身份信息,然后单击“下一步”
· 点击下一步”
· 在这里,您可以选择需要导入表格模型的所有表和视图。在我们的示例中,我们只需要“ FactInternetSales”和“ DimDate”表。因此,勾选“ FactInternetSales”和“ DimDate”表,然后单击“完成”。
· 关闭“表导入向导”
· 切换到“图解视图”。如您所见,只有一个 活性 DimDate和FactInternetSales表之间的关系以及其他两个关系是 不活跃 这意味着你不能 直 将导入的DimDate用于需要覆盖“订购日期”,“装船日期”和“到期日期”的所有三个应用程序。这意味着您无法将切片和切块 单一措施 并同时具有所有角色,在我们的示例中为``订购日期'',``发货日期''和``到期日期''。我会在这篇文章的后面详细解释。
解决方案:
1. 多次将DimDate导入表格模型:
在我们的示例中,我们需要将其导入三次以覆盖“订购日期”,“发货日期”和“到期日期”。
一种。 删除不活动的关系
b。 双击DimDate表名称,将其重命名为用户友好名称。将其命名为“订购日期”。
C。 为了使我们的示例更加不可测试,我创建了一个名为“订单日期详细信息”的新层次结构,其中包括“ CalendarYear”,“ EnglishMonthName”和“ FullDateAlternateKey”。 A还重命名了各列,以使用户对“年”,“月”和“全日期”更加友好。另外,我将DimDate表中的所有其他列设置为“从客户端工具隐藏”。我还将“ FactInternetSales”表重命名为“ Internet Sales”。
d。 我们已经成功设置了“订单日期”日期,现在我们需要再次导入DimDate表以支持“发货日期”。为此,请从“模型”菜单中选择“现有连接…”
e。 点击“打开”
F。 点击下一步”
G。 再次从列表中选择DimDate,然后单击“完成”。此过程将再次将DimDate表导入模型。然后,我们将其设置为涵盖“发货日期”。为此,请将“ Internet Sales”表中的“ ShipDateKey”链接到“ DimDate”表中的“ DateKey”。
H。 现在,从 b 至 g 但是,将“ DimDate”表命名为“ Ship Date”。再次重复上述部分,以将“到期日期”添加到模型中。
一世。 我们完成了,我们可以根据上述所有日期简单地切片和切块。
j。 由于表格模型无法自动检测到度量,因此我们需要至少定义一个度量以测试解决方案。为此,切换到“网格视图”并选择“ Internet销售”,然后定义“总销售金额”的度量。为此,只需单击“ SalesAmount”列中的“ Measures”部分,然后单击Sigma()按钮。然后将创建的度量重命名为“总销售额”。
k。 现在我们可以通过从“模型”菜单中选择“在Excel中分析”来测试解决方案
l。 勾选“总销售额”和“到期日详细信息”层次结构。您可以深入到月份和日期级别。
米 您可以对其他每个日期执行相同的操作,或者如果需要此报告,可以合并日期。
2. 在数据库中创建几个SQL Server视图:
在我们的示例中,在“ AdventureWorksDW”数据库中,我们为每个角色(订单日期,发货日期,到期日期)创建三个视图。我们在现有DimDate之上创建这些视图,它们的名称类似于三个不同的角色。然后,我们将这些视图导入表格模型,并使用适当的外键将每个视图链接到“ Internet Sales”表。由于整个过程与我们在第一个解决方案中所做的相同,因此我不再赘述。因此,归根结底,我们在数据库中将具有以下内容:
现在,您可以将上述视图导入表格中,而不必多次导入整个DimDate表。这将减小数据库的大小,并且更容易理解。但是,此解决方案与第一个解决方案非常相似。基本上,架构是相同的,但是,我们管理表的方式略有不同。
和在Excel中相同的结果:
3.制定若干措施:
第三种解决方案可能是大多数用例的最佳解决方案,与我们迄今为止所做的完全相反。好吧,我可以说架构是完全不同的。在此解决方案中,我们 不要 除掉 不活跃 人际关系 and 此外,我们 不要 导入多个“日期”维度副本。
在这种情况下,我们应该为每个角色创建新的措施,这意味着我们在示例中将采取以下三个措施:
1-按订单日期的总销售额
2-按发货日期的总销售额
3-按截止日期的总销售额
在此解决方案中,我们正在做的是设法使用与角色相关的关系。为此,我们只需要执行数据模型来激活我们需要的关系即可。我们可以使用以下方式轻松在DAX中建立活动和不活动的关系 用户名 功能。 用户名函数,首先禁用所有活动关系,然后激活所需的 关系。 用户名函数可以用作将过滤器作为参数的其他函数的一部分。这意味着我们总是将USERELATIONSHIP用作CALCULATE函数(或其他接受过滤器参数的函数)的一部分。因此,以上三种措施将如下所示:
1- 订单日期的总销售金额:= SUM(‘互联网销售” [销售金额])
2- 按发货日期的总销售金额:= CALCULATE(SUM(‘互联网销售” [销售金额]), 用户名(‘Date'[DateKey], ‘互联网销售” [ShipDateKey]))
3- 截止日期的总销售金额:= CALCULATE(SUM(‘互联网销售” [销售金额]), 用户名(‘Date'[DateKey], ‘互联网销售” [DueDateKey]))
如您所见,第一个措施是’t使用了USERELATIONSHIP。原因是度量使用模型中默认为活动的关系,因此我们不’无需再次执行。另一方面,其他两个措施正在强制措施中使用相关关系。
最后,这是在Excel中分析模型时的外观:
优点和缺点:
上面讨论的三个解决方案中的每一个都有优点和缺点。
前两个解决方案的优点,导入了多个Date维度:
1-如果您的模型是小型模型,则开发模型会更快
2-最终用户拥有不同的“日期”选项会更加容易。每个角色在可视化层中都将具有单独的切片器。
3-您只能使用一种度量并将其切成薄片并分别由不同的角色切成小块
缺点:
1-如果您的模型不小并且您要扮演的角色扮演维度要多得多,那么您’最终会多次导入这些尺寸,效率不高
2-在整个模型中,角色扮演维度各不相同,这对于最终用户确实会造成混淆,您真的需要花费更多的时间/金钱来培训最终用户
3-您消耗了更多的存储和内存,这又不是那么有效
最后一个解决方案的优点,可采取多种措施:
1-您可以并排使用所有角色,因为您实际上对每个角色都有单独的衡量标准
2–您没有导入角色的多个副本,例如,您只有一个“日期”维度,可用于对整个模型中的所有度量进行切片和切块
3-在存储和内存消耗方面更高效
4-当你不穿衣服时,你的模特会更整洁’在模型中扮演多个角色
缺点:
1-在具有许多不同角色的大型模型中,创建许多不同的措施来支持不同的角色既费时,又难以维护
2-小节名称变长
3-对于最终用户而言,拥有许多看起来非常相似的不同度量可能会使您感到困惑
全部做完!