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

标签 sql sql-server ssis etl

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

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

我有一张 table ,团队:

teamid Teamname
1      Team 1
2      Team 2

还有一个表 teamhierarchymapping:

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 中的各种管道(我刚刚开始学习),但我没有找到将其整合在一起的解决方案。

有人可以帮忙吗?

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

最佳答案

您的样本数据有错误吗?我看不到层次结构映射如何连接到层次结构表以获得您想要的结果,除非层次结构映射是 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”只是一个帮助器“ View ”,以使稍后的连接变得更简单。如果您只是采用更高的 CTE 并运行它,您将获得扁平 View :

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

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

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

关于sql - 使用 SSIS 将递归层次结构展平为维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089491/

相关文章:

sql - 使用 sp_help 的表结构

php - 如何防止此查询两次打印相同的结果?

sql - 如果没有 SET FMTONLY OFF,则无法执行临时表查询

sql - 如何在 SQL Server 中声明数组变量?

sql - SSIS OnPostExecute 事件 : How to see the execution result?

sql-server - 执行流程任务无法在作业中执行 Rust 脚本

c# - 用于删除和创建文件夹的 SSIS 脚本

mysql - 如何将数据库中的所有表转换为一种排序规则?

python - SQLAlchemy 不返回 SQL Server 数据库中的所有表名

sql-server - sql hub函数是否不允许整数作为列名?