Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 分析服务创建递归层次结构_Sql Server_Ssas_Analysis_Business Intelligence - Fatal编程技术网

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

Sql server 分析服务创建递归层次结构,sql-server,ssas,analysis,business-intelligence,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 在AnalysisService中,我想在维度中创建层

我有以下表格:

CatId    CatName    parent     CatId

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

在AnalysisService中,我想在维度中创建层次结构,这样就可以向下钻取到N级。。目前我只能做两个级别的。。类别和子类别。。但是,如果N级别至少在4-5个级别之前不可能,我想一直到N级别。

您尝试的层次结构类型称为父子维度。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)
然后,要获得下一个级别,请运行以下查询:

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)
注意递归内部联接。至少再运行一个查询以向下查看另一个级别,以验证键是否按预期方式“扩展”:

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将根据需要不断添加级别,直到数据耗尽。

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

  • 将父CatID设置为DSV中CatID的FK
  • 在维度层次结构管理器中将父属性引用为父属性类型
  • 将属性添加到层次结构中
嵌套级别应该能够在类别层次结构中浏览