我有以下表格:
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级。
答案 0 :(得分:2)
您尝试尝试的层次结构类型称为父子维度。 SSAS将使用递归连接将您的数据“爆炸”成树形。
但是你描述它的桌子有点令人困惑。所以我提供的解决方案需要你重新考虑一下你的桌子。对于层次结构中的每个节点(记录),将使用经典的Parent-Child:
在您的示例中,标记为“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维度就是一个例子。假设您的类别在您的事实表上:
应该能够在类别层次结构中浏览嵌套级别。