Eltérő részletezettségű adatok összehasonlítása egy adatkockában

Terv- és tényadatokat akarunk összehasonlítani egymással. Mind a terv, mind a tényadataink dimenzionáltsága azonos, (azaz például idő, cikk, vevő) csak részletezettségükben különböznek egymástól. A terv adatok nem állnak rendelkezésre napi szinten, míg a tényadatok igen. Tőlünk azt kérték, hogy mutassuk meg mind a terv, mind a tényadatokat egy OLAP kockában.

Az Analysis Services 2000 nem biztosít nekünk lehetőséget arra, hogy az egyes measure-ök, mint esetünkben a terv és tény, eltérő dimenzionáltságúak, vagy eltérő részletezettségűek legyenek. (Definíció szerint a kocka összes measure-ének azonos részletezettségűnek kell lennie) A kérdés tehát az, hogy milyen alternatívák léteznek a probléma megoldására?

Kővári Attila - 2005. február 12.

Szétosztott terv

Csináljunk a havi tervből napi tervet! Azaz képezzünk olyan napi tervsorokat, amelyeket felösszegezve (aggregálva) hónap szintre megkapjuk az eredeti havi tervszámokat. Így azonos részletezettségűvé tehetjük a terv- és tényadatokat, megszüntetve a kiinduló problémát.

Terv-tény adatok összehasonlítás elemi szintre szétosztott tervvel

Ezzel azonban olyan tervszámokat generálunk, amelyek nem is léteznek. Persze elmagyarázhatjuk mindenkinek, hogy a napi tervszámokat tilos nézni, mert azok nem valósak, de jobban járunk, ha ezt a módszert csak speciális esetekben alkalmazzuk. (Pl. időarányos terv-tény összehasonlítást kell végeznünk május 20.-ra, és nincs képünk a tervadatok hónapon belüli megoszlásáról. )

Eltüntetett elemi terv.

Szebb megoldást kapunk, ha a havi terveket egy összegben ráírjuk minden hónap első napjára, és az így kapott napi terv adatokat egy számított mező (Calculated member) segítségével eltüntetjük az OLAP kockából. (Például a 2004 januári 500 Ft tervet úgy írjuk be a ténytáblába, hogy 2004-01-01, 500Ft) Felösszegezve a kockát azt kapjuk, hogy január 1: 500Ft, január: 500Ft, I. Negyedév:…

Terv/tény adatok összehasonlítás az elemi terv eltüntetésével

Ahhoz hogy eltüntessük a napi terv adatokat a TervFt measure-ünket el kell tüntetnünk a felhasználó szeme elől (Visible=False), és létre kell hoznunk egy saját TERV számított mezőt, amely napi szinten nem jeleníti meg a hónap első napjára írt tervszámokat. A TERV számított mezőnk képlete a következő:

iif([Idöszak].currentmember.level is [Nap] ( , NULL , [Measures].[TervFt]

)

Szülő-gyerek (Parent-child) dimenziók

Az Analysis Services 2000 lehetőséget biztosít számunkra, hogy egy speciális, úgynevezett szülő-gyerek (Parent-Child) dimenzió létrehozásával, és annak „Members With Data” tulajdonságának átállításával („Non-leaf data hidden”-re) létrehozhassunk olyan szülő dimenzió elemeket, amelyekhez közvetlenül kapcsolhatunk ténytábla sorokat.

Ebben az esetben a ténytáblát úgy kell felépítenünk, hogy az napi részletezettséggel tartalmazza a tényadatokat és havi részletezettséggel tervadatokat. (a Dátum oszlop tartalmaz napokat és hónapokat is).

Terv/tény adatok összehasonlítás szülő-gyerek (parent-child) dimenziók segítségével

Ehhez a ténytáblához hozzá tudunk kapcsolni egy olyan szülő-gyerek dimenziót, amely segítségével szülő szintre is közvetlenül beolvashatunk adatokat.

Az eddig tárgyalt módszerek addig működnek, amíg azonos dimenzionáltságú de eltérő részletezettségű adatokat kell közös kockában ábrázolnunk. De az élet általában ennél bonyolultabb, és az összehasonlítandó adatok nem csak részletezettségükben, hanem dimenzionáltságukban is eltérnek. A következő megoldások ezt a problémát is kiküszöbölik.

Két kocka

Tegyük fel, hogy terv és tényadataink nem csak eltérő részletezettségűek, de még eltérő dimenzionáltságúak is. Azaz pl. nem terveznek vevőre csak cikkekre, és időben sem terveznek napra, csak hónapra.

Talán a legegyszerűbb megoldás, ha készítünk két OLAP kockát: egy Terv és egy Tény kockát. A terv kocka havi bontású, míg a ténykocka napi. A Terv kocka forrástáblájába a tényadatok mellé betöltjük a havi szintre aggregált tényadatokat is. Így a terv tény összehasonlítást a Terv kockában tudják elvégezni, a tényadatokat pedig a tény OLAP kockában tudják elemezni.

A kiinduló probléma az volt, hogy egy OLAP kockában legyenek megjelenítve az adatok. Megpróbálhatjuk nekik elmagyarázni, hogy ez így, két külön kockába jobb, mert más felhasználók használják a két kockát, máshogy kell jogosultságot kezelni, így módosítani tudják a tervszámokat (write back), ez így hatékonyabb, …stb.

Ha továbbra is ragaszkodnak ahhoz, hogy csak egy OLAP kockájuk legyen, ami mindkét adatot annak természetes részletezettségében tartalmazza, akkor új megoldást kell találnunk.

LookUpCube MDX függvény.

Ezen megoldás során is két kockát hozunk létre a maguk természetes részletezettségével. (A tény kocka napi bontású, a terv kocka marad havi). A tény kockába létrehozunk egy Terv nevű számított mezőt (Calculated member) amely a LookUpCube MDX függvény segítségével áthozza a terv adatokat (TervFt measure) a Terv kockából.

A terv kockát azonban elrejtjük a felhasználó elől. (Visible=False). Az MDX függvény látja a Terv kockát, de a felhasználó nem.

Így kapunk egy olyan Tény kockát, amelyben a tényadatok elemi részletezettséggel a tervadatok pedig havi bontásban állnak rendelkezésre. A terv számított mező a következő MDX függvényt tartalmazza:

LookupCube("[TervKocka]", "("

+MemberToStr([Idöszak].CurrentMember)+ ", " +MemberToStr([Cikk].CurrentMember)+ ", " +MemberToStr([Vevö].CurrentMember)+ ", "
+" [Measures].[TervFt])"

)

Melyik a legjobb megoldás?

Minden szempontot figyelembe véve (Karbantarthatóság, egyszerűség, bővíthetőség) az utolsó két módszer a legjobb választás. E két módszerrel tudjuk legjobban megvalósítani az eltérő részletezettségű adatok megjelenítését egy OLAP kockában.

Kővári Attila - BI projekt

Új hozzászólás