Funkcjonalność języka MDX w implementacji HYPERION



Podobne dokumenty
przygotował: Podstawy języka MDX Tworzenie zbiorów

Podstawy MDX. Podstawy MDX. Podstawy MDX. Struktura kostki [BiznesG]

OnLine Analytical Processing (OLAP) Kostki OLAP i zapytania MDX

Kostki OLAP i język MDX

Spis treści. Część I Wprowadzenie do pakietu oprogramowania Analysis Services

ORACLE. System Zarządzania Bazą Danych Oracle. Oracle Advanced SQL

MS Excel 2007 Kurs zaawansowany Obsługa baz danych. prowadzi: Dr inż. Tomasz Bartuś. Kraków:

Przestrzenne bazy danych Podstawy języka SQL

System imed24 Instrukcja Moduł Analizy i raporty

OLAP i hurtownie danych c.d.

Bazy danych Access KWERENDY

Sposób tworzenia tabeli przestawnej pokażę na przykładzie listy krajów z podstawowymi informacjami o nich.

Autor: Joanna Karwowska

WyŜsza Szkoła Zarządzania Ochroną Pracy MS EXCEL CZ.2

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

MDX ZAWARTOŚĆ O MDX. Wyk onał: Zatwi erdził: KSPBC_Szkolenie_ doc. Spra wdził: Strona 1 z 15

SQL (ang. Structured Query Language)

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Tabele przestawne tabelą przestawną. Sprzedawcy, Kwartały, Wartości. Dane/Raport tabeli przestawnej i wykresu przestawnego.

Systemy OLAP I. Krzysztof Dembczyński. Instytut Informatyki Zakład Inteligentnych Systemów Wspomagania Decyzji Politechnika Poznańska

Systemy GIS Tworzenie zapytań w bazach danych

Cw.12 JAVAScript w dokumentach HTML

Język SQL. Rozdział 2. Proste zapytania

Języki skryptowe w programie Plans

Technologie baz danych

MS Access - bazy danych.

Pracownia Informatyczna Instytut Technologii Mechanicznej Wydział Inżynierii Mechanicznej i Mechatroniki. Podstawy Informatyki i algorytmizacji

5. Integracja stron aplikacji, tworzenie zintegrowanych formularzy i raportów

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Metody Metody, parametry, zwracanie wartości

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Projekt ZSWS. Instrukcja uŝytkowania narzędzia SAP Business Explorer Analyzer. 1 Uruchamianie programu i raportu. Tytuł: Strona: 1 z 31

Oracle11g: Wprowadzenie do SQL

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

QUERY język zapytań do tworzenia raportów w AS/400

Relacyjne bazy danych. Podstawy SQL

% sumy wiersza nadrzędnego. % sumy kolumny nadrzędnej. % sumy elementu nadrzędnego. Porządkuj od najmniejszych do największych.

Autor: Joanna Karwowska

Załącznik nr 8. do Studium Wykonalności projektu Sieć Szerokopasmowa Polski Wschodniej województwo podkarpackie

Microsoft Excel 2003 profesjonalna analiza i raportowanie oraz prezentacja danych

Plan. Raport. Tworzenie raportu z kreatora (1/3)

Integracja i Eksploracja Danych

SQL do zaawansowanych analiz danych część 1.

Programowanie w języku Python. Grażyna Koba

Pracownia Informatyczna Instytut Technologii Mechanicznej Wydział Inżynierii Mechanicznej i Mechatroniki. Podstawy Informatyki i algorytmizacji

TP1 - TABELE PRZESTAWNE od A do Z

Autor: dr inż. Katarzyna Rudnik

Autor: Joanna Karwowska

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Zaawansowane aplikacje internetowe - laboratorium

Projektowanie relacyjnych baz danych

Część I Istota analizy biznesowej a Analysis Services

Kolumna Zeszyt Komórka Wiersz Tabela arkusza Zakładki arkuszy

LibreOffice Calc VBA

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Tworzenie i wykorzystanie usług sieciowych

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Podstawy języka SQL cz. 2

Bazy danych. Polecenia SQL

WYMAGANIA EDUKACYJNE Z INFORMATYKI dla klasy III gimnazjalnej, Szkoły Podstawowej w Rychtalu

Microsoft SQL Server Podstawy T-SQL

BAZY DANYCH Panel sterujący

Wprowadzenie do Hurtowni Danych. Mariusz Rafało

P&I Scout Pro Wygodne i proste tworzenie raportów

Systemy OLAP I. Krzysztof Dembczyński. Instytut Informatyki Zakład Inteligentnych Systemów Wspomagania Decyzji Politechnika Poznańska

o nazwie: adresy.xls. Fragment danych źródłowych przestawiono na rysunku 1. Rysunek 1. Dane źródłowe - plik "adresy.xls"

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Tworzenie tabeli przestawnej krok po kroku

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

JAVAScript w dokumentach HTML - przypomnienie

Grupowanie i funkcje agregacji

Technologie baz danych

5.5. Wybieranie informacji z bazy

Kwerendy (zapytania) wybierające

Wprowadzenie do hurtowni danych

Relacyjne bazy danych. Podstawy SQL

Baza danych sql. 1. Wprowadzenie

Arkusz kalkulacyjny Excel

Spis treści. 1: Wyszukiwanie elementu : Do linii modelu : Powiel arkusze : Długość kabla : Rozmieszczenie widoków...

KASK by CTI. Instrukcja

2. Podstawy narzędzia Application Builder, budowa strony, kreatory aplikacji

Model relacyjny. Wykład II

Analityczny język zapytań MDX: zaawansowane

ERGODESIGN - Podręcznik użytkownika. Wersja 1.0 Warszawa 2010

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS

Sortowanie i filtrowanie list

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz.3

1 Podstawy c++ w pigułce.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Niestandardowa tabela częstości

Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

Ustalanie dostępu do plików - Windows XP Home/Professional

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

Teoretyczne podstawy informatyki

Układy VLSI Bramki 1.0

SAS Institute Technical Support

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS

Transkrypt:

Funkcjonalność języka MDX w implementacji HYPERION Paweł Kędziora, Marek Lewandowski Politechnika Poznańska pawel.kedziora@gmail.com, lewandowski.marek@gmail.com

Spis Treści: 1 Standard MDX... 2 2 Postać zapytania w języku MDX Hyperion... 3 3 Funkcje w języku MDX Hyperion... 3 3.1 Predefiniowane funkcje języka MDX implementacji Hyperion... 3 3.2 Funkcje definiowane przez użytkownika... 10 4 Narzędzia wydawania zapytań do bazy danych... 11 4.1 Konsola MaxL Script Editor oraz konsola MDX Script Editor... 11 4.2 Hyperion Visual Explorer... 11 4.3 Hyperion Essbase Query Designer (Microsoft Excel)... 12 5 Przeprowadzony eksperyment... 13 5.1 Cel i zakres eksperymentu... 13 5.2 Schemat hurtowni danych.... 14 5.3 Dostępne dane... 16 5.4 Zapytania... 17 5.4.1 Wycięcie oraz obrót... 17 5.4.1.1 Wycięcie jednej warstwy kostki danych (zapytania 1, 2)... 17 5.4.1.2 Wycięcie więcej niż jednej warstwy kostki danych (zapytanie 3)... 18 5.4.1.3 Wycięcie z kostki za pomocą zakresu wymiarów (zapytania 4, 5)... 19 5.4.2 Drill up i Drill down... 20 5.4.2.1 Drill up i Drill down z wykorzystaniem standardowych funkcji (zapytania 6, 7, 8) 20 5.4.2.2 Operacje Drill up i Drill down z wykorzystaniem własności drzewa hierarchii elementów (zapytania 10, 11, 12, 13)... 21 5.4.3 Funkcje standardowe języka MDX w implementacji Hyperion... 22 5.4.3.1 Distinct (zapytanie 14)... 22 5.4.3.2 Except (zapytanie 15)... 23 5.4.3.3 Head, Tail (zapytania 16, 17)... 23 5.4.3.4 Union (zapytanie 18)... 24 5.4.3.5 Subset (zapytanie 19)... 24 5.4.3.6 Intersect (zapytanie 20)... 24 5.4.4 Elementy obliczone (calculated members) (zapytanie 21)... 25 5.4.5 Nazwane zbiory (named sets) (zapytanie 22)... 25 5.4.6 Filtrowanie wyników zapytań (zapytanie 23)... 26 5.4.7 Predykcja wartości (zapytanie 24)... 26 5.4.8 Sortowanie wyników zapytań (zapytanie 25)... 28 6 Podsumowanie... 29 7 Literatura... 29 1 Standard MDX MDX został wprowadzony w roku 1997 przez firmę Microsoft, jako część OLEDB dla specyfikacji OLAP. Specyfikacja ta została rozwinięta w 1998 roku, przez komercyjną wersję Microsoft OLAP Services 7.0 oraz później przez Microsoft Analysis Services. Mimo, iż MDX nie był otwartym standardem, szybko został zaadaptowany przez innych twórców systemów hurtowni danych, m.in.: Hyperion, SAS, SAP. 2

2 Postać zapytania w języku MDX Hyperion Ogólna postać zapytania w języku MDX wygląda następująco: SELECT {set} ON COLUMNS [, {set} ON ROWS] FROM aplikacja.baza_danych [WHERE {set}] gdzie set to jedna bądź wiele krotek, a krotka rozumiana jest jako odwołanie do elementu (member) lub kombinacji elementów z różnych wymiarów. Elementy podawane są w nawiasach kwadratowych ( [ ] ) i oddzielane przecinkiem (, ). Słowa kluczowe ON COLUMNS, ON ROWS określają format wyświetlania wierszy i kolumn wyniku zapytania. Przykład: SELECT { [Sales] } ON COLUMNS, { [Shops] } ON ROWS FROM app_shops.shops_db WHERE { [2005]}; Powyższe zapytanie zwróci w wartość sprzedaży (Sales) dla poszczególnych sklepów (Shops) w roku 2005 obliczoną na podstawie danych zawartych w bazie danych shops_db znajdującej się w aplikacji app_shops. Wynik zapytania przyjmie postać tabeli: Shops Shops Shop_1 Shop_2 Shop_n Sales Sales_1 + Sales_2 + + Sales_n Sales_1 Sales_2 Sales_n W pierwszym rzędzie tabeli znajduje się wynik zapytania o atrybut Sales dla wszystkich sklepów. Jeśli atrybut Sales jest atrybutem addytywnym, wielkość ta będzie sumą wartości Sales dla wszystkich krotek spełniających warunki zapytania. 3 Funkcje w języku MDX Hyperion 3.1 Predefiniowane funkcje języka MDX implementacji Hyperion Abs (liczba) przyjmuje wartość bezwzględną podanego parametru. Ancestor (element warstwa) przyjmuje wartość bezpośredniego poprzednika podanego elementu w hierarchii wymiarów. 3

Ancestors (element, warstwa indeks) zwraca zbiór poprzedników wskazanego elementu, występujących w hierarchii wymiarów do wysokości określonej przez indeks. Avg (zbiór [,liczba [, InculdeEmpty]]) zwraca średnią wartość krotek znalezionych we wskazanym zbiorze. W przypadku wyszczególnienia elementu liczba obliczana jest średnia dla zbioru krotek i drugiego parametru. Klauzula InculdeEmpty pozwala na uwzględnienie pustych wartości (#MISSING) podczas obliczania średniej. BottomCount (zbiór, indeks [,liczba]) funkcja zwraca podzbiór o liczebności indeks elementów zbioru set uporządkowanych od wartości najmniejszej do największej. Liczba wskazuje kryteria selekcji. BottomPercent (zbiór, procentowość, liczba) zwraca najmniejszy istniejący podzbiór zbioru zbiór, dla którego całkowity wynik przeliczeń jest nie mniejszy niż zadeklarowana procentowość przeliczeń całego zbioru zbiór. Procentowość jest liczbą z zakresu [0; 100]. Liczba wskazuje kryteria selekcji. Elementy zwróconego podzbioru uporządkowane są od najmniejszego do największego. BottomSum (zbiór, suma, liczba) zwraca najmniejszy istniejący podzbiór zbioru zbiór, dla którego całkowity wynik przeliczeń jest co najmniej równy podanemu wyrażeniu suma. Elementy zwróconego podzbioru uporządkowane są od najmniejszego do największego. Case słowo kluczowe rozpoczynające instrukcję warunkową case. Children (element) funkcja zwraca zbiór elementów potomnych wyszczególnionego elementu element. ClosingPeriod( [warstwa [, element]]) zwraca ostatni element wymiaru typu Time dla podanych parametrów. CoalesceEmpty ( element, wartość1 ) funkcja zwraca wartość wartość1 jeśli wartość elementu element jest pusta (#MISSING). W przeciwnym przypadku zwracana jest wartość elementu element. Count (zbiór [, IncludeEmpty]) funkcja zwraca liczebność zbioru zbiór. Parametr IncludeEmpty określa czy wartości puste (#MISSING) mają być ignorowane. Cousin (element1, element2) zwraca potomka innego elementu element2, znajdującego się na tym samym poziomie w hierarchii wymiarów co element element1. CrossJoin (zbiór1, zbiór2) zwraca iloczyn kartezjański zbioru zbiór1 i zbioru zbiór2. Zbiór2 nie może zawierać żadnych wymiarów wykorzystywanych w zbiorze zbiór1. CurrentMember (wymiar) zwraca aktualnie przetwarzany element dla wskazanego wymiaru wymiar. Funkcja wykorzystywana m.in. w funkcjach iteracyjnych. CurrentTupple (zbiór) zwraca aktualnie przetwarzaną krotkę wskazanego zbioru zbiór. Funkcja wykorzystywana w m.in. w funkcjach iteracyjnych. 4

DefaultMember (wymiar) zwraca domyślny element wyszczególnionego wymiaru wymiar. W Analytic Services domyślnym elementem jest element znajdujący się na pierwszym miejscu wśród elementów z najwyższego poziomu hierarchii wymiaru wymiar. Descendants (element [{ warstwa indeks}[, flaga]]) - zwraca elementy podrzędne znajdujące się w warstwie warstwa, lub na głębokości indeks w hierarchii wymiarów elementu element. Flaga wskazuje, które elementy mają być zwracane / pomijane. Wartości, jakie może przyjmować element flaga to: SELF zwraca tylko elementy z warstwy warstwa oraz element element, jeśli należy on do warstwy warstwa. AFTER zwraca elementy leżące poniżej warstwy warstwa. BEFORE zawraca element element oraz elementy znajdujące się w hierarchii wymiarów powyżej warstwy warstwa. BEFORE_AND_AFTER zwraca element element oraz wszystkie elementy znajdujące się poniżej niego w hierarchii wymiarów, ale nie należące do warstwy warstwa. SELF_AND_AFTER zwraca wszystkie elementy leżące w warstwie warstwa, oraz w warstwach leżących poniżej niej w hierarchii wymiarów. SELF_BEFORE_AFTER zwraca element element oraz wszystkie elementy leżące poniżej niego w hierarchii wymiarów. LEAVES zwraca elementy podrzędne elementu element, znajdujące na najniższym poziomie hierarchii wymiarów (liście drzewa wymiarów). Distinct (zbiór) funkcja eliminująca zduplikowane krotki ze zbioru zbiór. Dimension (element warstwa) funkcja zwracająca wymiar, do którego należy element lub warstwa. DrilldownByLayer ( zbiór [, warstwa indeks]) - funkcja wykonująca operację DrillDown na zbiorze zbiór, w ramach elementów należących do warstwy warstwa lub występujących na poziomie drzewa hierarchii określonego przez indeks. DrilldownMember (zbiór1, zbiór2 [, RECURSIVE]) funkcja wykonująca operację DrillDown na elementach należących do zbioru zbiór1, które również należą do zbioru zbiór2. RECURSIVE słowo kluczowe, którego użycie umożliwia wykonywanie powtarzających się porównań na elementach zbiorów. DrillupByLayer (zbiór, [, warstwa]) funkcja przeprowadzająca operację DrillUp wszystkich elementów zbioru zbiór leżących poniżej warstwy warstwa. DrillupMember (zbiór1, zbiór2) funkcja sprawdza, czy w zbiorze elementów zbiór2 znajdują się przodkowie zbioru elementów zbiór1 i wykonująca operację DrillUp do poziomu elementów przodków w zbiorze zbiór2. Except (zbiór1, zbiór2 [, ALL]) funkcja zwracająca różnicę zbiorów zbiór1 i zbiór2. Flaga ALL pozwala na pozostawienie duplikatów. Exp (potęga) funkcja matematyczna zwracająca liczbę e (podstawę logarytmu naturalnego) podniesioną do potęgi potęga. 5

Extract (zbiór [, wymiar]) funkcja zwracająca zbiór krotek należących do zbioru elementów zbiór, z podanego wymiaru wymiar. Factorial (liczba) funkcja matematyczna zwracająca silnię podanej liczby liczba. Filter (zbiór, warunek) funkcja zwracająca krotki należące do zbioru elementów zbiór, spełniające kryteria selekcji określone przez warunek. FirstChild (element) funkcja zwracająca pierwszego potomka (zależnie od kolejności definiowania) elementu element. FirstSibling (element) funkcja zwracająca pierwszy element (zależnie od kolejności definiowania) znajdujący się na tym samym poziomie hierarchii co element i mający taki sam jak element element nadrzędny. Generate (zbiór1, zbiór2 [, ALL]) funkcja zwracająca zbiór powstały w wyniku wykonania operacji: dla każdego elementu ze zbioru zbiór1 zwróć zbiór2. Klauzula ALL pozwala na pozostawienie duplikujących się elementów w zbiorze wynikowym. Generation (element) funkcja zwracająca elementy pokolenia, do którego należy element element. Generations (wymiar, indeks) funkcja zwracająca elementy pokolenia wymiaru wymiar do zadanej głębokości w hierarchii wymiarów określonej przez indeks. Head (zbiór [, liczba]) funkcja zwracająca liczba pierwszych krotek lub elementów należących do zbioru zbiór. Hierarchize (zbiór [, POST]) funkcja zwracająca elementy należące do zbioru zbiór w takim porządku, w jakim zostały one zdefiniowane w hierarchii wymiarów. Użycie klauzuli POST powoduje elementów podrzędnych przed nadrzędnymi. IIF (warunek, prawda, fałsz) funkcja weryfikująca prawdziwość warunku warunek i zwracająca wartość prawda, jeśli warunek jest prawdziwy, lub fałsz w przeciwnym przypadku. Prawda i fałsz mogą być zbiorami elementów! Int (liczba) funkcja matematyczna zwracająca najmniejszą liczbę całkowitą większą niż liczba. Intersection (zbiór1, zbiór2 [, ALL]) funkcja zwracająca iloczyn zbiorów zbiór1 i zbiór2. ALL pozwala na pozostawienie duplikujących się elementów w zbiorze wynikowym. Is (element1, element2) funkcja porównująca dwa elementy. Przyjmuje wartość TRUE, jeśli elemen1 i element2 są identyczne. 6

IsAccType (element, AccTag) funkcja sprawdzająca, czy element element należy do wymiaru zadeklarowanego jako Accounts i posiadającego odpowiednią etykietę AccTag. Etykieta może przyjąć jedną z następujących wartości: First, Last, Average, Expense, Two-pass. IsAncestor (element1, element2) funkcja przyjmująca wartość TRUE, jeśli element element1 jest przodkiem elementu element2. IsChild (element1, element2) funkcja przyjmująca wartość TRUE, jeśli element element1 jest potomkiem elementu element2. IsEmpty (element) funkcja przyjmująca wartość TRUE w przypadku, gdy element jest pusty (#MISSING). IsGeneration (element, indeks) funkcja przyjmująca wartość TRUE, jeśli element element należy do pokolenia wskazanego przez indeks. IsLeaf (element) funkcja przyjmująca wartość TRUE, jeśli element element znajduje się na najniższym poziomie hierarchii wymiarów (jest liściem drzewa wymiarów). IsLevel (element, poziom) - funkcja przyjmująca wartość TRUE, jeśli element element znajduje się w hierarchii wymiarów na poziomie określonym przez poziom. IsSibling (element1, element2) - funkcja przyjmująca wartość TRUE, jeśli element element1 znajduje się na tym samym poziomie w hierarchii wymiarów i ma ten sam element nadrzędny co element element2. IsUDA (element, nazwa) - funkcja przyjmująca wartość TRUE, jeśli element element jest powiązany z etykietą UDA (user defined attribute) o nazwie nazwa. IsValid (element krotka zbiór warstwa własność) - funkcja przyjmująca wartość TRUE, jeśli wyszczególniony parametr jest poprawny. Item (krotka, indeks) ekstrahuje element o numerze indeks z krotki krotka. Lag (element, indeks) zwraca element, który znajduje się indeks kroków wstecz od elementu element w hierarchii wymiarów. LastChild (element) funkcja zwracająca ostatniego potomka (zależnie od kolejności definiowania) elementu element. LastPeriods (liczba [, element]) funkcja zwracająca ciąg elementów o liczebności liczba, który zakończony jest elementem element. LastSibling (element) funkcja zwracająca ostatni element (zależnie od kolejności definiowania) znajdujący się na tym samym poziomie hierarchii co element i mający taki sam jak element element nadrzędny. 7

Lead (element, indeks) funkcja zwracająca element, który znajduje się indeks kroków w przód od elementu element w ramach tej samej warstwy w hierarchii wymiarów. Level (element) funkcja zwracająca poziom w hierarchii wymiarów, na którym znajduje się element element. Levels (wymiar, indeks) funkcja zwracająca poziom wymiaru wymiar określony przez głębokość indeks. Ln (liczba) funkcja matematyczna zwracająca logarytm naturalny z liczby liczba. Log (liczba [, podstawa]) - funkcja matematyczna zwracająca logarytm o podstawie podstawa z liczby liczba. Domyślną wartością parametru podstawa jest 10. Log10 (liczba) - funkcja matematyczna zwracająca logarytm dziesiętny z liczby liczba. Max (zbiór [, liczba]) - funkcja matematyczna zwracająca element o największej wartości spośród elementów zbioru zbiór. Liczba jest parametrem opcjonalnym. MemberRange (element1, element2) zwraca wszystkie elementy występujące pomiędzy element1 i element2 w hierarchii wymiarów. Members (wymiar warstwa) funkcja zwraca wszystkie elementy należące do wymiaru wymiar bądź warstwy warstwa. Min (zbiór [, liczba]) - funkcja matematyczna zwracająca element o najmniejszej wartości spośród elementów zbioru zbiór. Liczba jest parametrem opcjonalnym. Mod (liczba1, liczba2) funkcja matematyczna zwracająca resztę z dzielenia liczby liczba1 przez liczbę liczba2. NextMember (element [, GENERATION LEVEL]) funkcja zwracająca kolejny element (zależnie od kolejności definiowania) w stosunku do element, w ramach pokolenia (GENERATION) lub poziomu (LEVEL). NonEmptyCount (zbiór [, liczba]) funkcja zwracająca liczbę krotek posiadających niepuste wartości. OpeningPeriod ( [warstwa [, element]]) - zwraca pierwszy element wymiaru typu Time dla podanych parametrów. Order (zbiór, wyrażenie liczba [, BASC BDESC] ) funkcja porządkująca elementy zbioru zbiór zgodnie z regułami określonymi przez wyrażenie. BASC rosnąco; BDESC malejąco. Ordinal (warstwa) funkcja zwracająca numer pokolenia lub poziomu w hierarchii wymiarów dla warstwy warstwa. 8

ParallelPeriod ( [warstwa [, indeks [, element]]]) funkcja zwraca element z wcześniejszego okresu czasu dla podanych parametrów. Parent ( element ) funkcja zwracająca element nadrzędny w hierarchii wymiarów w stosunku do elementu element. PeriodsToDate ( [warstwa [, element]]) funkcja zwracająca elementy, które występują wcześniej niż aktualny element z wymiaru Time dla podanych parametrów. Power (liczba, potęga) funkcja matematyczna przyjmująca wartość liczby liczba podniesionej do potęgi potęga. PrevMember (element [, GENERATION LEVEL]) funkcja zwracająca poprzedni element (zależnie od kolejności definiowania) w stosunku do element, w ramach pokolenia (GENERATION) lub poziomu (LEVEL). RelMemberRange (element, poprzednie, następne [, GENERATION LEVEL]) funkcja zwracająca poprzednie poprzednich elementów elementu element, następne następnych elementów elementu element w ramach danego pokolenia (GENERATION) lub poziomu (LEVEL). Remainder (liczba) funkcja matematyczna zwracająca część ułamkową z liczby liczba. Round (liczba, dokładność) - funkcja matematyczna zaokrąglająca liczbę liczba zgodnie z precyzją wskazaną parametrem dokładność. Siblings (element) funkcja zwracająca zbiór elementów znajdujących się na tym samym poziomie w hierarchii co element i mających ten sam element poprzedni. Subset (zbiór, indeks1 [, indeks2]) funkcja zwracająca podzbiór (wyspecyfikowany zakresem krotek: od indeks1 do indeks2) zbioru zbiór. Sum (zbiór [, liczba]) funkcja zwracająca sumę elementów wchodzących w skład zbioru zbiór. Tail (zbiór [, liczba]) funkcja zwracająca liczba ostatnich krotek lub elementów należących do zbioru zbiór. ToDate (ciąg1, ciąg2) funkcja zmieniająca datę na liczbę. Ciąg1 określa format daty ( mm-dd-yyyy lub dd-mm-yyyy ), a ciąg2 to data (np. 21-06-2006 ). TopCount (zbiór, indeks [, liczba]) funkcja zwracająca indeks elementów zbioru zbiór uporządkowanych od największego do najmniejszego. TopPercent (zbiór, procentowość, liczba) zwraca najmniejszy istniejący podzbiór zbioru zbiór, dla którego całkowity wynik przeliczeń jest nie mniejszy niż zadeklarowana procentowość przeliczeń całego zbioru zbiór. Procentowość jest liczbą z zakresu [0; 100]. Liczba wskazuje kryteria selekcji. Elementy zwróconego podzbioru uporządkowane są od największego do najmniejszego. 9

TopSum (zbiór, suma, liczba) zwraca najmniejszy istniejący podzbiór zbioru zbiór, dla którego całkowity wynik przeliczeń jest co najmniej równy podanemu wyrażeniu suma. Elementy zwróconego podzbioru uporządkowane są od największego do najmniejszego. Truncate (liczba) funkcja matematyczna zwracająca całkowitą część liczby liczba. Uda (wymiar element, nazwa) funkcja zwraca wszystkie elementy wyszczególnione etykietą UDA (user defined attribute) o nazwie nazwa związane z wymiarem wymiar lub poddrzewem wymiarów o korzeniu w elemencie element). Union (zbiór1, zbiór2 [, ALL]) funkcja zwracająca sumę zbiorów zbiór1 i zbiór2. ALL pozwala na pozostawienie duplikujących się elementów w zbiorze wynikowym. Value (element) funkcja zwracająca wartość elementu element. WithAttr (element, LITERAŁ [, literał_numeryczny, literał_znakowy] ) funkcja zwracająca wszystkie elementy, które są związane z elementem element w wskazany sposób. Wartości, które mogą być przyjmowane przez LITERAŁ: >, >=, <, <=, = =, <>! =, In. xtd ([element]) funkcja równoważna PeriodsToDate. 3.2 Funkcje definiowane przez użytkownika System Hyperion umożliwia użytkownikowi tworzenie własnych funkcji. Funkcje te definiowane są w języku JAVA, kompilowane przez zewnętrzny kompilator języka JAVA, a następnie dołączane do schematu bazy danych. Język MDX służy jedynie do zadeklarowania funkcji poprzednio zdefiniowanych. Przykład definicji funkcji w języku JAVA: public class CalcFunc { public static double sum (double[] data) { int i, n = data.length; double sum = 0.0d; for (i=0; i<n; i++) { double d = data [i]; sum = sum + d; } return sum; } } Przykład deklaracji zdefiniowanej funkcji: create function Sample.'@JSUM' as 'CalcFunc.sum' spec '@JSUM(memberRange)' comment 'adds list of input members'; Wszystkie nazwy funkcji w języku MDX w implementacji Hyperion muszą zaczynać się od znaku @. 10

4 Narzędzia wydawania zapytań do bazy danych 4.1 Konsola MaxL Script Editor oraz konsola MDX Script Editor Do bezpośredniego wpisywania zapytań do bazy danych w języku MDX służą dwie konsole: MaxL Script Editor oraz MDX Script Editor. MDX Script Editor posiada opcję podpowiadania składni języka MDX, natomiast konsola MaxL Script Editor jest zauważalnie szybsza i z tego powodu została wybrana do przeprowadzenia eksperymentu. Wysłanie zapytania do bazy danych następuje poprzez wciśnięcie przycisku F5. Wynik zapytania przedstawiany jest w postaci tabeli. Rys. 4.1 Widok okna konsoli MaxL Script Editor wraz z wynikiem zapytania. 4.2 Hyperion Visual Explorer Hyperion Visual Explorer włączony zostaje poprzez uruchomienie pliku runvss.exe z katalogu \essbase\bin znajdującego się w katalogu głównym systemu Hyperion. Hyperion Visual Explorer jest narzędziem do graficznego przedstawiania wyników zapytań do bazy danych, którego użytkowanie nie wymaga znajomości języka MDX. Zapytania wydawane są poprzez umieszczanie żądanych elementów (metodą przeciągnij i upuść ) w odpowiednich polach (oznaczających osie rzędnych i odciętych na wykresach). Ograniczanie wyników zapytań realizowane jest przez zaznaczanie / odznaczanie pól typu check box przyporządkowanych do każdego elementu. 11

Wynik zapytania przedstawiany jest domyślnie w postaci wykresu słupkowego. Typ wykresu może być modyfikowany. Rys. 4.2 Hyperion Visual Explorer i wynik zapytania o [Obrót] w pierwszych trzech miesiącach lat [2005] i [2006] Rys. 4.3 Ograniczanie zakresu elementu w zapytaniu w Hyperion Visual Explorer. 4.3 Hyperion Essbase Query Designer (Microsoft Excel) Po zainstalowaniu systemu Hyperion, w głównym menu programu Microsoft Excel pojawia się dodatkowa opcja Essbase, umożliwiająca m.in. podłączanie do bazy danych oraz otwarcie narzędzia Hyperion Query Designer. Wybór opcji New Query powoduje przejście do kreatora zapytania, którego poszczególne składniki wybierane są przez użytkownika za pomocą kliknięć myszką na żądanych elementach odpowiednich wymiarów, co podobnie jak w przypadku Hyperion Visual Explorer, nie wymaga od użytkownika znajomości języka MDX. Wysłanie zapytania do bazy danych dokonane 12

zostaje poprzez wybór opcji Apply Query z menu kontekstowego przygotowywanego zapytania. Rys. 4.4 Widok okna kreatora zapytania w Hyperion Essbase Query Designer. Rys. 4.5 Wynik zapytania w Microsoft Excel 5 Przeprowadzony eksperyment. 5.1 Cel i zakres eksperymentu. Celem eksperymentu było zbudowanie hurtowni danych oraz zbadanie funkcjonalności języka MDX w implementacji Hyperion. Hurtownia została zbudowana dla rzeczywistych danych następujących spółek giełdowych: PKO BP, INGBSG, BZWBK, Prokom, 13

Comarch, Comp, KGHM, STALEXP, ATM, TPSA, Orbis, Amrest. Dla każdej spółki i dla każdego jej notowania dostępne były następujące dane: wartość podczas otwarcia oraz zamknięcia notowania, wartość minimalna i maksymalna w danym dniu, zmiana notowania, dzienny obrót. 5.2 Schemat hurtowni danych. Zaproponowany schemat przewiduje istnienie jednej tabeli faktów (Notowanie), oraz czterech wymiarów: Czas, Rok, Sektor, Index. Hyperion proponuje stosowanie określenia element (member) zarówno jako terminu opisującego wystąpienie wymiaru, wymiaru nadrzędnego, bądź też konkretnej wartości wymiaru. W zastosowanym schemacie element Czas jest więc nadrzędny w stosunku do elementów grupujących wystąpienia wymiaru (poszczególne dni) w miesiące, a Sektor posiada elementy podrzędne określające typ działalności spółek do niego należących (banki, informatyka, p_metalowy, telekomunikacja, usługi). Utworzono bazę danych spolkidb w aplikacji SPOLKI. Rys. 4.1 Tabela faktów (Notowanie) oraz wymiar Index 14

Rys. 4.2 Elementy: Rok, Czas, Sektor wraz z elementami podrzędnymi. Rys. 4.3 Pojedyncze wystąpienia dni w elemencie agregującym [Jan] (styczeń). 15

5.3 Dostępne dane Udostępnione do analizy dane znajdowały się w plikach.csv o następującym formacie: Data;Otw.;Min;Maks.;Zamkn.;Zmiana;Obrót 2006.03.31;147.00;146.00;148.50;147.00;+1.03;85944 2006.03.30;145.00;145.00;147.00;145.50;+1.39;51777 2006.03.29;144.00;141.00;144.00;143.50;-1.03;28302 2006.03.28;149.00;145.00;149.00;145.00;-2.36;20590 ( ) W celu dostosowania danych do wymaganego przez Hyperion formatu i zgodności z skonstruowanym schematem napisany został skrypt w języku AWK: { gsub (";", "\t"); if (NR == 1) {print;} if (NR == 2) {print;} if(nr > 2) { gsub("+", ""); if($0 ~ /^2005\.*/) { gsub("2005.01.", "\"Jan "); gsub("2005.02.", "\"Feb "); gsub("2005.03.", "\"Mar "); gsub("2005.04.", "\"Apr "); gsub("2005.05.", "\"May "); gsub("2005.06.", "\"Jun "); gsub("2005.07.", "\"Jul "); gsub("2005.08.", "\"Aug "); gsub("2005.09.", "\"Sept "); gsub("2005.10.", "\"Oct "); gsub("2005.11.", "\"Nov "); gsub("2005.12.", "\"Dec "); print "\"2005\"\t" $1 " " $2 "\"\t" $3"\t" $4"\t" $5"\t" $6"\t" $7"\t" $8; } else if($0 ~ /^2006\.*/) { gsub("2006.01.", "\"Jan "); gsub("2006.02.", "\"Feb "); gsub("2006.03.", "\"Mar "); gsub("2006.04.", "\"Apr "); gsub("2006.05.", "\"May "); gsub("2006.06.", "\"Jun "); gsub("2006.07.", "\"Jul "); gsub("2006.08.", "\"Aug "); gsub("2006.09.", "\"Sept "); gsub("2006.10.", "\"Oct "); gsub("2006.11.", "\"Nov "); gsub("2006.12.", "\"Dec "); print "\"2006\"\t" $1 " " $2 "\"\t" $3"\t" $4"\t" $5"\t" $6"\t" $7"\t" $8; } } } 16

Wynikiem działania skryptu jest plik tekstowy o następującym formacie: PROKOM WIG20 Otw. Min Maks. Zamkn. Zmiana Obrót "2006" "Mar 31" 147.00 146.00 148.50 147.00 1.03 85944 "2006" "Mar 30" 145.00 145.00 147.00 145.50 1.39 51777 "2006" "Mar 29" 144.00 141.00 144.00 143.50-1.03 28302 Dane wczytano do systemu wybierając opcję Load Data ( Load Data File) z menu kontekstowego bazy danych spolkidb. 5.4 Zapytania 5.4.1 Wycięcie oraz obrót 5.4.1.1 Wycięcie jednej warstwy kostki danych (zapytania 1, 2) Zapytanie o obrót z dnia 09.05.2005 dla spółek sektora bankowego wchodzących w skład indeksu WIG20: {[Obrót]} on rows, { ([May 09], [2005], [banki], [wig20])} on columns Równoznaczne zapytanie z zastosowanie prefiksów w postaci nazw wymiarów (dla czytelności zapytania): {[Obrót]} on rows, { ( [czas].[may 09], [rok].[2005], [sektor].[banki], [index].[wig20] ) } on columns Columns i rows mogą zostać zastąpione przez axis(1) i axis(0) : {[Obrót]} on axis(1), { ([May 09], [2005], [banki], [wig20])} on axis(0) 17

Zapytanie o obrót wszystkich spółek wchodzących w skład indeksu WIG20 (dla wszystkich notowań w bazie danych): {[Obrót]} on rows, {[wig20]} on columns 5.4.1.2 Wycięcie więcej niż jednej warstwy kostki danych (zapytanie 3) Zapytanie o obroty (w roku 2005) spółki Techwig oraz wszystkich spółek wchodzących w skład indeksu WIG20: {[Obrót]} on rows, { ([techwig], [2005]), ([wig20], [2005])} on columns Zastosowanie nawiasów okrągłych () oznacza rozpoczęcie nowej kolumny w wyniku zapytania. Równoważne zapytanie może być sformułowane z wykorzystaniem funkcji CrossJoin, lub za pomocą klauzuli ograniczającej: where {[Obrót]} on rows, crossjoin({[techwig], [wig20]}, {[2005]}) on columns {[Obrót]} on rows, {[techwig], [wig20]} on columns SPOLKI.spolkiDB ([2005]); 18

5.4.1.3 Wycięcie z kostki za pomocą zakresu wymiarów (zapytania 4, 5) Zapytanie o obrót spółek z notowań od stycznia do marca, z podziałem na lata: { ( [Obrót], [2005] ), ( [Obrót], [2006] ) } on rows, {[Jan]:[Mar]} on columns Równoważne zapytanie może zostać sformułowane z użyciem funkcji MemberRange: { ( [Obrót], [2005] ), ( [Obrót], [2006] ) } on rows, {MemberRange([Jan],[Mar])} on columns Zapytanie o obrót spółek wchodzących w skład indeksu WIG20 w dniach od 12.01.2005 do 14.01.2005: crossjoin ({[Obrót]}, {[wig20]}) on rows, crossjoin ({Memberrange([Jan 12], [Jan 14])}, {[2005]}) on columns 19

5.4.2 Drill up i Drill down 5.4.2.1 Drill up i Drill down z wykorzystaniem standardowych funkcji (zapytania 6, 7, 8) Zapytanie o obroty w roku 2005 wszystkich spółek. Wynik przedstawiony z podziałem na sektory. drilldownbylayer ({ [sektor]} ) on columns, {([Obrót], [2005])} on rows spolki.spolkidb; Zapytanie o obroty wszystkich elementów podrzędnych w stosunku do elementu Sektor (aż do pierwszego poziomu w pokoleniu) z notowań z roku 2005: drillupbylayer ( {sektor, [sektor].children }, generations (sektor, 1) ) on columns, {([Obrót], [2005])} on rows spolki.spolkidb; Zapytanie o obroty wszystkich elementów podlegających pod spółkę PKOBP. drillupmember({[pkobp]}, {[sektor]}) on columns, {Obrót} on rows spolki.spolkidb; Na wyniku przeprowadzana jest operacja DrillUp aż do elementu sektor, jeśli tylko sektor jest elementem nadrzędnym w stosunku do spółki PKOBP. 20

5.4.2.2 Operacje Drill up i Drill down z wykorzystaniem własności drzewa hierarchii elementów (zapytania 10, 11, 12, 13) Zapytanie o obroty (w roku 2005) wszystkich sektorów spółek znajdujących się na tym samym poziomie w drzewie hierarchii elementów co sektor informatyka: {([Obrót], [2005])} on rows, { [informatyka].siblings } on columns Zapytanie o obroty (w roku 2005) wszystkich spółek elementu nadrzędnego w stosunku do elementu informatyka: {([Obrót], [2005])} on rows, { [informatyka].parent } on columns Zapytanie o obroty (w roku 2005) wszystkich spółek podrzędnych w stosunku do elementu informatyka: {([Obrót], [2005])} on rows, { [informatyka].children } on columns Zapytanie o obroty (w roku 2005) spółki, która została zdefiniowana jako pierwszy element podrzędny w stosunku do elementu informatyka: 21

{([Obrót], [2005])} on rows, { [informatyka].firstchild } on columns Zapytanie o obroty (w roku 2005) wszystkich elementów leżących o jeden poziom niżej w hierarchii niż element sektor wraz z agregacją do poziomu sektor: crossjoin ({[Obrót]},{ members(sektor.levels(1)), members(sektor.levels(0))}) on rows, {[2005]} on columns 5.4.3 Funkcje standardowe języka MDX w implementacji Hyperion 5.4.3.1 Distinct (zapytanie 14) Zapytanie o obroty (w roku 2005) wszystkich spółek z sektora informatyka, z eliminacją duplikujących się krotek: 22

{([Obrót], [2005])} on rows, distinct ({ [informatyka].children}) on columns 5.4.3.2 Except (zapytanie 15) Zapytanie o obroty (w roku 2005) wszystkich spółek z sektora informatyka, które równocześnie nie należą do sektora bankowego. {([Obrót], [2005])} on rows, except ({ [informatyka].children}, { [banki].children}) on columns 5.4.3.3 Head, Tail (zapytania 16, 17) Zapytanie o obroty (w roku 2005) pierwszego elementu (znajdującego się w drugim pokoleniu elementu sektor). Pierwszy wskazuje w tym przypadku kolejność definiowania elementów podczas tworzenia bazy danych. {([Obrót], [2005])} on rows, head( members([sektor].generations(2))) on columns Zapytanie o obroty (w roku 2005) ostatniego elementu (znajdującego się w drugim pokoleniu elementu sektor). Ostatni wskazuje w tym przypadku kolejność definiowania elementów podczas tworzenia bazy danych. 23