3

我有下表:

CatId    CatName    parent     CatId

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

在分析服务中,我想在维度上创建层次结构,以便我可以向下钻取到 N 级。目前我只能做到 2 级。类别和子类别。但我想一直到 N 级如果至少在 4-5 级之前不可能达到 N 级。

4

2 回答 2

2

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

但是您描述的表格有点令人困惑。所以我提供了一个解决方案,需要你重新考虑一下你的桌子。层次结构中的每个节点(记录)都有一个经典的父子节点:

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

在您的示例中,标记为“父”的列似乎是多余的。您示例中的最后一列(称为“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 并创建父子维度。这有点复杂,这看起来像是一篇很棒的入门文章。SSAS 将根据需要不断添加级别,直到数据用完。

于 2013-03-14T15:56:22.137 回答
2

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

  • 将您的 ParentCatID 设置为 DSV 中 CatID 的 FK
  • 将您的父属性引用为维度层次结构管理器中的父属性类型
  • 将属性添加到您的层次结构中

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

于 2013-03-14T23:18:41.390 回答