共享维度
多维分析模型是以维度(Dimension)为基础, 维度又是由其维度表中的不同字段组成, 我们可以对维度表的字段进行不同方式的组织顺序和设置不同属性, 那么一种组织方式就是一个层次结构(Hierarchy), 字段就是其层级 (Level), 一个维度(Dimension)可以设置多个层次结构(Hierarchy)来表示维度的不同分析方式.
本文以 Demo - FoodMart Model 模型为例讲解在多维分析建模场景中如何创建公共的共享维度.
创建公共维度
我们以 Warehouse 为分析维度来创建公共维度.
- 打开语义模型 Demo - FoodMart Model 点击左侧栏中的添加按钮, 或者将左侧栏下方区域里的维度表
warehouse
拖至模型区域, 进行创建实体; - 选择类型为 维度(
Dimension
) 输入名称 Warehouse 和描述 仓库 , 选择物理表为warehouse
, 点击应用; - 新建维度会创建一个默认的层次结构(Hierarchy), 标签与此维度相同;
创建维度层级
层次结构(Hierarchy)的层级一般按照粒度由粗到细的顺序设置, 如 warehouse
的字段层级可以设置为:
warehouse_country
warehouse_state_province
warehouse_city
warehouse_id
接下来让我们创建维度的层级字段:
- 在层级区域的下方可以看到
warehouse
表已经添加进来 (如果需要多张表关联可以将左边数据表区域内的表拖至此区域, 具体可以参考星形和雪花模型); - 展开
warehouse
表, 可以看到表字段列表. 依次将上面列出的字段拖至层级区域; 每当层级变化时在右侧数据区域可以预览实际维度数据的变化, (计数列为数据库中实际存在的条目数). - 拖动层级字段可以调整先后顺序, 也可以拖至删除按钮上进行删除;
层级详细信息
选中层级字段, 打开右侧属性编辑界面, 设置层级详细属性:
参考 维度设计器#创建层级
The
uniqueMembers
attribute is used to optimize SQL generation. If you know that the values of a given level column in the dimension table are unique across all the other values in that column across the parent levels, then setuniqueMembers="true"
, otherwise, set to"false"
. For example, a time dimension like[Year].[Month]
will haveuniqueMembers="false"
at the Month level, as the same month appears in different years. On the other hand, if you had a[Product Class].[Product Name]
hierarchy, and you were sure that[Product Name]
was unique, then you can setuniqueMembers="true"
. If you are not sure, then always setuniqueMembers="false"
. At the top level, this will always beuniqueMembers="true"
, as there is no parent level.
层级属性
为层级设置属性字段列表, 然后就可以使用 MDX 语句的 member.Properties("propertyName")
函数来访问成员属性, 并且用 DIMENSION PROPERTIES [Hierarchy].[Level].[Property Name]
将属性输出在结果中.
SELECT {[Store Sales]} ON COLUMNS,
TopCount(Filter([Store].[Store Name].Members,
[Store].CurrentMember.Properties("Store Type") = "Supermarket"),
10,
[Store Sales])
DIMENSION PROPERTIES [Store].[Store Name].[Store Type] ON ROWS
FROM [Sales]
层级属性设置界面如下:
在多维数据集中引用公用维度
创建库存多维模型(Inventory Cube)
- 使用物理表
inventory_fact
创建多维模型多维数据集(Cube), 输入名称 Inventory, 描述 库存; - 新增度量字段:
- 名称(Name):
sales
- 标签(Caption):
销售额
- 字段(Column):
warehouse_sales
- 聚合类型(Aggregator):
Sum
- 名称(Name):
添加共享维度
- 在 Inventory 页面中, 在模型列表中拖动上面创建的共享维度 Warehouse 到维度区域;
- 还要修改外键(Foreign Key)属性, 点击 Warehouse 维度, 打开右边属性设置栏, 选择事实表(Fact)表相应的外键(Foreign Key), 此字段将作为关联字段与公共维度 Warehouse 的主键进行关联(Join);
- 注意这里的名称(Name)和外键(Foreign Key)都是必输;
- 点击保存, 正常情况下提示保存成功.
验证结果
打开 Inventory 页面里的 计算 页面, 可以看到下方预览区域:
- 将上一步添加的维度 Warehouse 拖至计算预览区域中的行上, 可以看到数据预览区有一行 All 成员
- 将度量 销售额 拖至计算区域中的列上, 可以看到数据预览区多出了一列度量;
- 点击维度 Warehouse 的层级按钮打开菜单, 选择唯一的层次结构为 Warehouse, 然后再选择层级, 可以看到不同层级下右边数据的变化;
在故事仪表板中使用维度
创建新的故事仪表板或者转到已有的故事仪表板.
在用到维度的设置里都可以看到 Warehouse 这个维度;
例如创建一个新的图形组件, 选择数据源和模型 Inventory 后在 Dimensions 区域则可以选择 Warehouse 维度;