您似乎正在尝试创建一种名为“父子维度”的层次结构。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会根据需要不断添加层级,直到没有数据为止。