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

时间:2013-03-07 12:32:54

标签: sql-server ssas analysis business-intelligence

我有以下表格:

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中我想在维度中创建Hierarchy,这样它就可以向下钻取到N Level ..目前我只能做到2级..类别和子类别..但我想去如果N水平不可能至少达到N水平,直到4-5级。

2 个答案:

答案 0 :(得分:2)

您尝试尝试的层次结构类型称为父子维度。 SSAS将使用递归连接将您的数据“爆炸”成树形。

但是你描述它的桌子有点令人困惑。所以我提供的解决方案需要你重新考虑一下你的桌子。对于层次结构中的每个节点(记录),将使用经典的Parent-Child:

  • 节点的密钥(ID)
  • 节点
  • 的文字文字(名称)
  • 称为父级的外键

在您的示例中,标记为“parent”的列似乎是多余的。示例中的最后一列(称为“CatID”)是维度的父级通常的样子。如果您认为表中的每条记录都是“子”,则子项的父级将作为指针返回到拥有或包含该记录的某些记录。在层次结构的最高级别,记录将没有Parent,因此Parent列设置为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并创建父子维度。这有点复杂,看起来像a great starter article。 SSAS将根据需要不断添加级别,直到数据用完为止。

答案 1 :(得分:2)

在AdventureWorks中,Employee维度就是一个例子。假设您的类别在您的事实表上:

  • 将您的ParentCatID设置为DSV中的CatID的FK
  • 在Dimension Hierarcy manager
  • 中引用您的Parent属性作为Parent Attribute类型
  • 将该属性添加到您的层次结构

应该能够在类别层次结构中浏览嵌套级别。