8. listopadu 2015

MDX Tutorial 9. – Navigace v hierarchii 2. část

V minulém dílu tutorialu jsme se začali věnovat navigačním funkcím (práce s přímým příbuzenstvem v hierarchii http://www.neoral.cz/2015/10/mdx-tutorial-8-navigace-v-hierarchii-1.html). Dnes navážeme funkcemi pro přístup k příbuzným vzdálenějším. Začneme obrázkem, kde se vše točí kolem current membera
Členové směrem nahoru nad currentmemberem jsou ancestors, linie potomstva descendants, prvek na stejné úrovni pod jiným parentem Cousin. Přehledná tabulka s výčtem funkcí:
Funkce
Popis (návratová hodnota member/set)
Ancestor(Member, Level | Distance)
Člen z úrovně / vzdálenosti nad current (member)
Ancestors(Member, Level | Distance)
Člen z úrovně/vzdálenosti nad current (set 1 prvek)
Ascendants(Member)
Linie nad memberem(set)
Descendants(member|set,level|distance, [flag])
Linie položky pod memberem z úrovně/hloubky (set)
Cousin(Member1, Member2)
položka se stejným pořadovým číslem pod jiným parentem (member)
Následující dotaz ná vrátí časovou hierarchii na úrovni měsíců a počítaný člen který vrátí jméno currentmembera
WITH MEMBER x AS
       [Dim Date].[YQMD].currentmember.name
SELECT
       {x}
ON COLUMNS,
       {[Dim Date].[Year].[Year]*
       [Dim Date].[YQMD].[Month]}
ON ROWS
FROM [MDX Tutorial]
Ancestor/Ancestors
Funkce Ancestor vrátí člena z linie nahoru jako member. Ancestors vrátí jednoprvkovou množinu z linie nahoru. Rozdíl mezi nimi je, že Ancestor můžete použít v tuplu, Ancestors v rámci agregační funkce.
WITH MEMBER [current] AS
       [Dim Date].[YQMD].currentmember.name
MEMBER [Ancestor] AS
       Ancestor(
       [Dim Date].[YQMD].currentmember
       ,[Dim Date].[YQMD].[Year])
       .name
MEMBER [Ancestors] AS
       SetToStr(
       Ancestors(
       [Dim Date].[YQMD].currentmember
       ,[Dim Date].[YQMD].[Year])
       )
SELECT
       {[current]
       ,[Ancestor]
       ,[Ancestors]}
ON COLUMNS,
       {[Dim Date].[Year].[Year]*
       [Dim Date].[YQMD].[Month]}
ON ROWS
FROM [MDX Tutorial]

Jaké by mohlo být použití těchto funkcí? Například výpočet poměr aktuálního prvku versus nadřízený prvek v hierarchii o několik úrovní, potažmo na konkrétní úrovni.
Ascendants
Vrátí celou linii směrem nahoru. Ideální funkce například na zobrazení linie nad zaměstnancem v rámci organizační struktury. Následující dotaz vrátí celou linii nad Amy Alberts v databázi Adventure Works
SELECT
       {}
ON COLUMNS,
ascendants(
       [Dim Employee].[Parent Employee Key].&[290]
       )
ON ROWS
FROM [MDX Tutorial]

Cousin
Funkce Cousin vrátí prvek, který má stejné pořadové číslo jako aktuální člen, ale pod jiným parentem. Použitelná by tato funkce mohla být například pro některé časové scénáře. To by šlo ale i jednodušeji časovými funkcemi (práci s časem se budeme věnovat samostatně v dalším díle)
WITH MEMBER x AS
       COUSIN( [Dim Date].[YQMD].currentmember
       , [Dim Date].[YQMD].currentmember.parent.prevmember )
       .uniquename
SELECT
       {x}
ON COLUMNS,
       [Dim Date].[Year].[Year]*
       [Dim Date].[YQMD].[Quarter]
ON ROWS
FROM [MDX Tutorial]

Descendants
Bez této funkce bych pravděpodobně nemohl fungovat. Vrátí množinu prvků z úrovně, nebo vzdálenosti pod vybraným členem. Má dvě varianty. Buď jako druhý argument definujeme level, nebo vzdálenost. Třetí argument flag je volitelný.
Začnu variantou s levelem.
DESCENDANTS( «Member»[, «Level»[, «Desc_flags»]] )
Ta se hodí zejména pokud se potřebujete dostat na libovolnou úroveň bez ohledu na to, kde se v hierarchii momentálně nacházíte. Nejčastěji tento scénář používám při práci s časem, když se chci dostat na úroveň datumu (aplikace v článku o semiaditivních měřítkách http://www.neoral.cz/2015/05/semi-aditivni-meritka-v-ssas-pomoci-mdx.html)
Zde pro přehlednost jen jednoduchá syntaxe
WITH MEMBER x AS
settostr(
       DESCENDANTS(
       [Dim Date].[YQMD].currentmember
       ,[Dim Date].[YQMD].[Date]
       )
       )
SELECT
       {x}
ON COLUMNS,
       [Dim Date].[Year].[Year]*
       [Dim Date].[YQMD].[Month]
ON ROWS
FROM [MDX Tutorial]

Variantu se “hloubkou”
DESCENDANTS( «Member»,«Distance»[, «Desc_flags»] )
používám často v SSRS grafech, kde chci mít možnost vybírat na jaký detail má být graf zobrazen. Následující dotaz zobrazí data na úroveň měsíce, pokud bychom místo 3 napsali 2, bylo by to na kvartál, 1 na rok...
SELECT
       {}
ON COLUMNS,
       [Dim Date].[Year].[Year]*
       DESCENDANTS(
       [Dim Date].[YQMD].[All]
       ,3 /*zde by byl místo konstanty parametr*/
       )
ON ROWS
FROM [MDX Tutorial]

Variantu s v Flagy používám hlavně u parentchild hierarchií, flag self_and_after umožní vrátit úroveň kterou vybereme a všechny úrovně pod. Linii pod Welckerem Brianem v AdventureWorks bych získal
SELECT
       {}
ON COLUMNS,
       descendants(
       [Dim Employee].[Parent Employee Key].&[277]
       ,0
       ,self_and_after)
ON ROWS
FROM [MDX Tutorial]

Abych nemusel psát extra kapitolu kvůli navigaci v rámci stejné úrovně vpřed vzad, přidám ještě tyto navigační funkce
Funkce
Funkce
Popis (návratová hodnota member/set)
member.prevmember
Předchozí člen (member)
member.nextmember
Následující člen (member)
member.lag(N)
předchozí člen o N prvků (member)
member.lead(N)
následující člen o N prvků (member)
WITH MEMBER [current] AS
       [Dim Date].[YQMD].currentmember.name
MEMBER [prevmember] AS
       [Dim Date].[YQMD].currentmember.prevmember.name
MEMBER [nextmember] AS
       [Dim Date].[YQMD].currentmember.nextmember.name
MEMBER [lag] AS
       [Dim Date].[YQMD].currentmember.lag(6).name
MEMBER [lead] AS
       [Dim Date].[YQMD].currentmember.lead(6).name
SELECT
       {[current],[prevmember],[nextmember],[lag],[lead]}
ON COLUMNS,
       [Dim Date].[YQMD].[Date].&[2005-01-27T00:00:00]
ON ROWS
FROM [MDX Tutorial]

Závěr:

Dnes to bylo poměrně hodně funkcí a pojal jsem to spíš syntakticky, než každou funkci s podrobnějším příkladem. Více jsem rozebral funkci Descendants, bez které si aplikované MDX nedokážu dost dobře představit. Tímto končí kapitola o navigačních funkcích, příště se budu věnovat práci s časem. Pokud bude čas zajisté :)

Žádné komentáře:

Okomentovat