Уплощение рекурсивной иерархии в измерение с помощью SSIS - PullRequest
1 голос
/ 03 ноября 2010

У меня есть рекурсивная иерархия в реляционной базе данных, это отражает команды и их положение в иерархии.

Я хочу объединить эту иерархию в измерение для хранилищ данных, это база данных 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 (который я только начинаю поднимать), и я не нахожу решение, которое объединяет его.

Кто-нибудь может помочь?

(Изменить исправленную проблему с образцомданные, я думаю)

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Есть ли причина, по которой вам нужно сгладить иерархию? Рассмотрим тип измерения иерархии «родитель-потомок» в SSAS, он обрабатывает иерархии переменной глубины и допускает дополнительные функции / возможности, которых не будет в плоской иерархии:

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

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

1 голос
/ 03 ноября 2010

У вас есть ошибка в ваших данных образца? Я не вижу, как отображение иерархии соединяется с таблицей иерархии для получения желаемых результатов, если только отображение иерархии не является teamid 1 => hierid 2 и teamid 2 => hierid 4.

Служба SSIS, возможно, не сможет это сделать (легко), поэтому может быть лучше создать источник OLEDB, который выполняет SQL следующего формата. Обратите внимание, что предполагается, что вы используете 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

Следующая его часть в основном использует это плоское представление, присоединяет его к таблицам вашей команды (чтобы получить имя команды) и использует PIVOT SQL Server, чтобы вращать его и выровнять все так, как вы хотите. Дополнительная информация о PIVOT доступна на MSDN .

Если вы используете SQL Server 2005, тогда вы можете просто взять бит выравнивания иерархии, и вы сможете использовать собственный блок преобразования SSIV 'PIVOT', чтобы, надеюсь, выполнить грязную поворотную работу.

...