2013-03-07 2 views
3

У меня есть следующая таблица:Анализ службы создать рекурсивную иерархию

CatId CatName parent  CatId 

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

В Analysis Service Я хочу создать иерархию в измерении таким образом, что она позволяет мне детализировать до N уровня .. В настоящее время я в состоянии сделать это только 2 уровня. Категория и подкатегория .. но я бы хотел пройти до уровня N, если уровень N невозможен до 4-5 уровней.

ответ

2

Тип иерархии, которую вы пытаетесь сделать, называется размером родительского ребенка. SSAS будет использовать рекурсивные соединения для «взорвать» ваши данные в форме дерева.

Но ваш стол, как вы его описываете, немного запутан. Поэтому я предлагаю решение, которое требует, чтобы вы немного пересмотрели свой стол. Классическим родитель-ребенок будет иметь для каждого узла (запись) в иерархии:

  • ключ (ID) для узла
  • Дословный текст (Имя) для узла
  • Внешний ключ называется родительский

В вашем примере столбец с надписью «parent» представляется излишним. Последний столбец в вашем примере (так называемый «CatID») - это то, как обычно выглядит родительский размер. Если вы считаете, что каждая запись в таблице является «дочерним», родительский элемент дочернего элемента действует как указатель назад к какой-либо записи, которая владеет или содержит эту запись. На самом высоком уровне иерархии записи не будут иметь родителя, поэтому для столбца Родитель установлено значение NULL.

Переименуйте второй «CatID» в «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 и создадите размер родительского ребенка. Это немного сложнее, и это выглядит как a great starter article. SSAS будет продолжать добавлять уровни по мере необходимости, пока не закончится информация.

2

В AdventureWorks пример Employee имеет пример этого.Если предположить, что категория находится на вашем фактографической таблице:

  • Установите ParentCatID, чтобы быть FK из CatID в DSV
  • Reference ваш атрибут Родитель как тип родительского атрибута в менеджере Dimension Hierarcy
  • Добавьте атрибут в вашу иерархию

Вложенные уровни должны быть доступны в вашей иерархии категорий.

Смежные вопросы