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í:
Následující dotaz ná vrátí časovou hierarchii
na úrovni měsíců a počítaný člen který vrátí jméno currentmembera
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)
|
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