分析服务创建递归层次结构。

3

I have following table:

CatId    CatName    parent     CatId

1        Category   1           NULL
2        Category   2           NULL
3        SubCat     1           1
4        SubSubCat  1           3
5        SSSubCat   1           4

在Analysis Service中,我想创建层次结构维度,以便可以向下钻取到N级别。目前只能做到两个级别,即类别和子类别。但如果无法实现N级别,则至少应该能钻取到4-5个级别。
2个回答

2
在AdventureWorks中,Employee维度有一个这样的例子。假设您的类别在事实表上:
  • 将您的ParentCatID设置为DSV中CatID的FK
  • 将您的Parent属性作为维度层次管理器中的Parent属性类型引用
  • 将属性添加到您的层次结构中
您应该能够在类别层次结构中浏览嵌套的级别。

2
您似乎正在尝试创建一种名为“父子维度”的层次结构。SSAS将使用递归连接将您的数据“展开”成树形状。
但是,您描述的表有些混乱。因此,我提供了一个需要您重新思考表格的解决方案。经典的父子维度对于层次结构中的每个节点(记录)都有以下内容:
- 该节点的键(ID) - 该节点的文本内容(名称) - 一个称为父级的外键
在您的示例中,标记为“parent”的列似乎是多余的。您的示例中的最后一列(称为“CatID”)通常是维度的父级所看起来的样子。如果您将表中的每个记录视为“子代”,则其父代作为指向拥有或包含该记录的某条记录的指针。在层次结构的最高级别上,记录将没有父代,因此将父代列设置为NULL。
请将第二个“CatID”重命名为“parent”,并删除或重命名名为“Parent”的原始列(您不需要该列)。如果您按照我的建议调整了表格,则应通过运行以下查询检查最高级别是否正确:
SELECT CatID, CatName, parent FROM mytable WHERE (parent IS NULL)

然后,要获取下一级,请运行以下查询:
SELECT HighestLevel.CatID, HighestLevel.CatName, HighestLevel.parent, Level2.CatID AS Level2ID, Level2.CatName AS Level2Name
FROM mytable AS HighestLevel
INNER JOIN mytable AS Level2 ON HighestLevel.CatID = Level2.parent
WHERE (HighestLevel.parent IS NULL)

请注意递归的INNER JOIN。运行至少一个查询以查看下一级并验证键是否按照您所期望的方式“扩展”:
SELECT HighestLevel.CatID, HighestLevel.CatName, HighestLevel.parent, Level2.CatID AS Level2ID, Level2.CatName AS Level2Name, Level3.CatID AS Level3ID, Level3.CatName AS Level3Name
FROM mytable AS HighestLevel
INNER JOIN mytable AS Level2 ON HighestLevel.CatID = Level2.parent
INNER JOIN mytable AS Level3 ON Level2.CatID = Level3.parent
WHERE (HighestLevel.parent IS NULL)

您可以继续添加层级来确保数据的准确性。这就是建立父子层次结构时,SSAS所做的事情。
最后,您将把此表添加到DSV中,并创建一个父子维度。这有点复杂,可以参考这篇优秀的入门文章。SSAS会根据需要不断添加层级,直到没有数据为止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接