使用 SSIS 将递归层次结构展平为维度

问题描述 投票:0回答:3

我在关系数据库中有一个递归层次结构,这反映了团队及其在层次结构中的位置。

我希望将这个层次结构扁平化为数据仓库的维度,它是一个 SQL Server 数据库,使用 SSIS 到 SSAS。

我有一张桌子,团队:

teamid Teamname
1      Team 1
2      Team 2

还有一个表团队层次结构映射:

Teamid  heirarchyid
1       4
2       2

和表层次结构:

sequenceid  parentsequenceid  Name
1           null              root
2           1                 Level 1.1
3           1                 Level 1.2
4           3                 Level 1.2 1

给予

      Level 1.1 (Contains Team 2)
root <
      Level 1.2 <
                 Level 1.2 1 (Contains Team 1)

我想将其压平为如下尺寸:

Team Name   Level 1    Level 2    Level 3
Team 1      Root       Level 1.1  [None]
Team 2      Root       Level 1.2  Level 1.2 1

我尝试了各种令人讨厌的 SQL 集来尝试将其整合在一起,并尝试了 SSIS 中的各种管道(我刚刚开始学习),但我没有找到将其整合在一起的解决方案。

有人可以帮忙吗?

(我认为使用示例数据编辑更正的问题)

sql sql-server ssis etl
3个回答
2
投票

您的样本数据有错误吗?我看不到层次结构映射如何连接到层次结构表以获得您想要的结果,除非层次结构映射是 teamid 1 => hierid 2 和 teamid 2 => hierid 4。

SSIS 可能无法(轻松)做到这一点,因此最好创建一个执行以下格式 SQL 的 OLEDB 源。请注意,这确实假设您使用的是 SQL Server 2008,因为其中引入了“PIVOT”功能...

WITH hier AS (
    SELECT parentseqid, sequenceid, hiername as parentname, hiername FROM TeamHierarchy
    UNION ALL
    SELECT hier.parentseqid, TH.sequenceid, hier.parentname, TH.hiername FROM hier
        INNER JOIN TeamHierarchy TH ON TH.parentseqid = hier.sequenceid
    ),
    teamhier AS (
        SELECT T.*, THM.hierarchyid FROM Teams T
            INNER JOIN TeamHierarchyMapping THM ON T.teamid = THM.teamid
    )
    SELECT *
        FROM (
            SELECT ROW_NUMBER() OVER (PARTITION BY teamname ORDER BY teamname, sequenceid, parentseqid) AS 'Depth', hier.parentname, teamhier.teamname
                FROM hier
                    INNER JOIN teamhier ON hier.sequenceid = teamhier.hierarchyid
        ) as t1
        PIVOT (MAX(parentname) FOR Depth IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) AS pvtTable
        ORDER BY teamname;

这有一些不同的元素,并且可能有更好的方法来做到这一点,但对于扁平化层次结构来说,CTE 是理想的选择。

创建了两个 CTE:“hier”负责扁平化层次结构,“teamhier”只是一个辅助“视图”,使稍后的连接变得更简单。如果您只是采用更高的 CTE 并运行它,您将获得扁平视图:

WITH hier AS (
    SELECT parentseqid, sequenceid, hiername as parentname, hiername FROM TeamHierarchy
    UNION ALL
    SELECT hier.parentseqid, TH.sequenceid, hier.parentname, TH.hiername FROM hier
        INNER JOIN TeamHierarchy TH ON TH.parentseqid = hier.sequenceid
    )
    SELECT * FROM hier ORDER BY parentseqid, sequenceid

它的下一部分基本上采用这个扁平化视图,将其连接到您的团队表(以获取团队名称),并使用 SQL Server 的 PIVOT 对其进行旋转,并使所有内容按照您想要的方式对齐。有关 PIVOT 的更多信息,请访问 MSDN

如果您使用的是 SQL Server 2005,那么您只需采用层次结构扁平化位,并且您应该能够使用 SSIS 的本机“PIVOT”转换块来完成肮脏的旋转工作。


1
投票

您需要扁平化层次结构是否有原因?考虑 SSAS 中的父子层次结构维度类型,它可以处理可变深度层次结构,并且允许使用扁平层次结构所不允许的额外功能/特性:

http://msdn.microsoft.com/en-us/library/ms174846.aspx

http://msdn.microsoft.com/en-us/library/ms174935.aspx


0
投票

您可以逐步执行此操作。只需将parent_id链接到每个级别的id,然后合并其结果,并根据您需要的级别经常执行此操作。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.