Moduł 6 Wersja 1.0 Spis treści Analityczny język zapytań MDX: wstęp Analityczny język zapytań MDX: wstęp... 1 Informacje o module... 2 Przygotowanie teoretyczne... 3 Podstawy teoretyczne... 3 Porady praktyczne... 4 Uwagi dla studenta... 4 Dodatkowe źródła informacji... 5 Laboratorium podstawowe... 6 Laboratorium rozszerzone... 15 Zadanie 1 (czas wykonania 8 min)... 15 Zadanie 2 (czas wykonania 8 min)... 15 Zadanie 3 (czas wykonania 8 min)... 15 Zadanie 4 (czas wykonania 10 min)... 15 Zadanie 5 (czas wykonania 10 min)... 15
Informacje o module Opis modułu W module poznasz podstawy języka MDX (MultiDimensional extensions), za pomocą którego można operować na danych przechowywanych w schemacie wielowymiarowym. Opisana jest składnia, a także podstawowe funkcje w MDX wraz z przykładami. Przykłady operują na testowym schemacie firmy Adventure Works. Cel modułu Celem modułu jest poznanie podstawowej składni języka MDX, co pozwala na projektowanie zapytań operujących na kostkach danych, a także zrozumienie różnic pomiędzy kostką, wymiarem, hierarchią, poziomem, atrybutem i agregatem. Uzyskane kompetencje Po zrealizowaniu modułu będziesz: znał podstawy języka MDX potrafił napisać proste zapytanie MDX bazujące na kostce wielowymiarowej rozumiał różnice pomiędzy wymiarem, hierarchią, poziomem, atrybutem i agregatem Wymagania wstępne Przed przystąpieniem do pracy z tym modułem powinieneś: znać podstawy języka SQL rozumieć budowę kostek danych Mapa zależności modułu Zgodnie z mapą zależności przedstawioną na Rys. 1, przed przystąpieniem do realizacji tego modułu należy zapoznać się z materiałem zawartym w modułach 3, 4, 5. Rys. 1 Mapa zależności modułu Strona 2/15
Przygotowanie teoretyczne Podstawy teoretyczne Język MDX nie jest wrażliwy na wielkość liter. Wszystkie słowa kluczowe mogą być napisane małymi lub dużymi literami. Różnica jest przy nazwach kostek, wymiarów, hierarchii, poziomów, atrybutów i elementów. Zapytanie MDX posiada następującą składnię (w uproszczonej wersji): [WITH <specyfikacja formuly> [,<specyfikacja formuly> ]] [<specyfikacja osi> [,<specyfikacja osi> ]] FROM [<specyfikacja kostki>] [WHERE [<specyfikacja warunków]] Na każdej osi jest lista punków w przestrzeni wielowymiarowej <specyfikacja osi>:: <zbiór punktów> ON <nazwa osi> Nazwa osi dopuszcza następujące wartości: <nazwa osi>:: COLUMNS ROWS PAGES SECTIONS CHAPTERS AXIS (index) Zapytanie którego wynikiem jest przestrzeń dwuwymiarowa: { <KOLEKCJA> } ON COLUMNS, { <KOLEKCJA> } ON ROWS FROM [<KOSTKA DANYCH>] WHERE (<WARUNEK>) Schemat zapytania jest wielowymiarowy (wielowymiarowa kostka), podobnie jak wynik też może być wielowymiarowy. Wiele wymiarów uzyskujemy zastępując COLUMNS i ROWS odpowiednio na AXIS(0) i AXIS(1). Dalsze wymiary uzyskujemy poprzez zwiększanie parametru: AXIS(N) gdzie N=0..127. Choć istnieje 128 osi, to pięciu pierwszym przypisane są nazwy (jako komentarz w poniższym przykładzie): { KOLEKCJA } ON AXIS(0), // COLUMNS { KOLEKCJA } ON AXIS(1), // ROWS { KOLEKCJA } ON AXIS(2), // PAGES { KOLEKCJA } ON AXIS(3), // SECTIONS { KOLEKCJA } ON AXIS(4) // CHAPTERS FROM [KOSTKA DANYCH] WHERE (WARUNEK) Jedna z kolekcji powinna zawierać agregaty. W kolejnych zapytaniach składnia zapytania znacznie się rozbuduje, pojawią się nowe funkcje i słowa kluczowe. Zapytanie MDX jest bardzo podobne do zapytania SQL. Bardziej rozbudowane zapytanie może wyglądać tak: { [Measures].[Agregat 1], [Measures].[Agregat 2] } ON COLUMNS, { [Wymiar].[Hierarchia].[Poziom].&[Element 1], [Wymiar].[Hierarchia].[Poziom].&[Element 2], [Wymiar].[Hierarchia].[Poziom].&[Element 3] } ON ROWS FROM [KOSTKA DANYCH] WHERE ([Wymiar 2].[Hierarchia 2].[Poziom 2].&[Element 1]) Kolekcję można również wyrazić poprzez: { [Wymiar].[Poziom].&[Element 1], [Wymiar].[Poziom].&[Element 2] } Strona 3/15
We frazie WHERE mogą także być umieszczone agregaty, w tym przypadku na osiach należy umieścić kolekcje elementów z różnych hierarchii: { KOLEKCJA } ON COLUMNS, { KOLEKCJA } ON ROWS FROM [KOSTKA DANYCH] WHERE ([Measures].[Agregat 1]) W powyższym przypadku kolekcje powinny zawierać zbiory elementów w ramach wymiarów. Inny przykład kolekcji z użyciem funkcji: { [Wymiar].[Poziom].Funkcja } { [Wymiar].[Hierarchia].Funkcja } { [Wymiar].[Poziom].&[Element].Funkcja } Niektóre funkcje istnieją tylko w postaci parametrycznej, gdzie parametrem jest wymiar, poziom, hierarchia lub element: { Funkcja([Wymiar]) } { Funkcja([Wymiar].[Poziom]) } { Funkcja([Wymiar].[Hierarchia].[Poziom]) } { Funkcja([Wymiar].[Hierarchia]) } { Funkcja([Wymiar].[Poziom].&[Kod elementu]) } { Funkcja([Wymiar].[Poziom].[Nazwa elementu]) } Funkcje można zagnieżdżać, typ wyjściowy funkcji wewnętrznej musi się zgadzać z typem wejściowym funkcji zewnętrznej. Niektóre funkcje posiadają wiele parametrów. { Funkcja2( Funkcja1( KOLEKCJA ELEMENT ) ) } Porady praktyczne Uwagi ogólne Każde zapytanie MDX znajdujące się w instrukcji spróbuj wykonać i przeanalizować, co dokładnie otrzymujemy jako wynik. O ile to możliwe, spróbuj korzystać z pomocy online dotyczącej języka MDX (link znajduje się w dodatkowych źródłach informacji). Mity na temat MDX: wszyscy znają SQL, ale nikt nie zna MDX, MDX jest językiem trudnym i skomplikowanym, nie można napisać prostych zapytań w MDX. Fakty na temat MDX: podstawowe zapytania są podobne do zapytań SQL, tworzenie raportów jest dużo prostsze w MDX niż w SQL, nie trzeba tworzyć skomplikowanych złączeń wielu tabel, operowanie na zbiorach jest tak samo proste jak operowanie na relacjach. Uwagi dla studenta Jesteś przygotowany do realizacji laboratorium jeśli: rozumiesz jak zbudowany jest schemat wielowymiarowy znasz pojęcie kostki, wymiaru, hierarchii, poziomu, właściwości, agregatu umiesz napisać proste zapytanie SQL rozróżniasz pojęcie poziomu od elementu dla tym poziomie znasz podstawowe operacje na zbiorach (suma zbiorów, różnica zbiorów, iloczyn zbiorów) wiesz jaka jest różnica pomiędzy wartością agregowaną i nieagregowaną Przed wykonywaniem każdego punktu dokładnie przeczytaj cały punkt, to spowoduje znaczne zmniejszenie liczby pomyłek podczas laboratorium i pozwoli na dokładniejsze poznanie materiału. Strona 4/15
Pamiętaj o zapoznaniu się z uwagami i poradami zawartymi w tym module. Upewnij się, że rozumiesz omawiane w nich zagadnienia. Jeśli masz trudności ze zrozumieniem tematu zawartego w uwagach, przeczytaj ponownie informacje z tego rozdziału i zajrzyj do notatek z wykładów. Dodatkowe źródła informacji 1. George Spofford: "MDX Solutions: With Microsoft SQL Server Analysis Services" 2. Mark Whitehorn, Robert Zare, Mosha Pasumansky: "Fast Track to MDX" 3. Strona internetowa: http://msdn.microsoft.com/en-us/library/ms145595.aspx 4. Strona internetowa: http://www.mosha.com/msolap/articles/mdxforeveryone.htm Strona 5/15
Laboratorium podstawowe Na wstępie zaprezentujemy środowisko, w którym będziemy projektować i uruchamiać raporty MDX. Następnie poprzez szereg przykładów, przeplatającej się teorii i zadań kontrolnych nauczymy Cię analizować schemat wielowymiarowy, a następnie projektować proste zapytania MDX korzystając z szeregu dostępnych funkcji. Zadanie 1. Konfigurowani e i przenoszenie bazy 2. Analiza kostek danych i wymiarów dla hurtowni Tok postępowania Uruchom SQL Server Business Intelligence Development Studio. Otwórz projekt AdventureWorksDW. W projekcie jest gotowy przykład hurtowni danych opartej na bazie relacyjnej. Należy zmienić tylko źródło danych, którym będzie baza AdventureWorksDW. Może to być lokalna baza podawana jako (local), lub baza zdalna na serwerze jako IP\nazwa_bazy. W oknie Solution Explorer rozwiń Data Sources. Kliknij dwukrotnie na Adventure Works DW.ds. Wybierz przycisk Edit otworzy się okienko do ustawienia danych źródłowych dla tego projektu hurtowni. Ustaw nazwę serwera (podaną przez prowadzącego) i nazwę bazy danych na AdventureWorksDW. Przetestuj połączenie z bazą za pomocą przycisku Test Connection (znajduje się w lewym dolnym roku okienka). Naciśnij OK potwierdzając wybór pliku bazy, kolejny raz OK potwierdzając wybór połączenia. Wybierz menu kontekstowe dla projektu (prawy przycisk myszy) i następnie wybierz opcję Properties, w Configuration Properties wybierz Deployment, w polu Server wpisz ścieżkę do serwera (np.: localhost lub ADRES\NAZWA_SERWERA, w szczególności będzie to localhost, jeżeli baza działa na lokalnym komputerze), jako bazę danych wpisz AdventureWorksDW. Wybierz menu kontekstowe dla projektu (prawy przycisk myszy) i następnie wybierz opcję Rebuild. Wyniki budowania pokażą się w oknie Output, jeżeli okno nie jest widoczne, to można go pokazać za pomocą wybrania View Output w menu głównym, lub przyciśnięcia skrótu klawiszowego Ctr-Atl-O. Wybierz menu kontekstowe dla projektu (prawy przycisk myszy) i następnie wybierz opcję Process po tej operacji baza danych będzie już na serwerze MS SQL Server 2008 razem z informacjami o kostkach i wymiarach. W pojawiającym się okienku naciśnij Run i czekaj chwilę do zakończenia procesu. Po naciśnięciu Process może pokazać się komunikat, że najpierw trzeba przeprowadzić akcję Rebuild i Deploy. Należy kliknąć Tak aby przebudować projekt. Uruchom SQL Server Management Studio. W oknie Object Explorer kliknij Connect i z rozwijanego menu wybierz Analysis Services. Wpisz nazwę serwera (localhost) i kliknij na przycisk Connect. Rozwiń dostępne bazy danych. Kliknij prawym przyciskiem myszy na bazie Adventure Works DW Strona 6/15
3. Przykładowe zapytania MDX 4. Wymiar przecięcia i z kontekstowego menu wybierz New Query -> MDX. Po wybraniu nowego zapytania MDX pojawiło się okienko, dla którego z lewej strony jest do dyspozycji skrócona wersję danych o kostkach i wymiarach. Sprawdź dostępne kostki. Dla każdej kostki sprawdź dostępne wymiary. Dla każdej kostki sprawdź dostępne agregaty (Measures). Czy wymiary są współdzielone czy osobne dla każdej kostki? Czy agregaty są współdzielone czy osobne dla każdej kostki? Do okienka zapytania MDX wpisz: {[Measures].[Amount]} ON COLUMNS, {[Account].[Account Number].&[8030]} ON ROWS FROM [Finance] Naciśnij klawisz F5 (wykonanie zapytania). Następnie przeanalizuj wynik zapytania. Co uzyskałeś za pomocą takiego zapytania? W SQL definiowane są kolumny, natomiast zapytanie wyznacza wiersze, natomiast w MDX definiujemy zarówno kolumny jak i wiersze, zapytanie oblicza wartości w komórkach. Na jednej osi powinny znajdować się agregaty (Measures). Do okienka zapytania MDX wpisz: {[Measures].[Amount]} ON COLUMNS, {[Account].[Account Number]} ON ROWS FROM [Finance] Jak można zauważyć, brak elementu dla wymiaru powoduje wypisanie elementu domyślnego, w tym przypadku sumarycznego konta [All Accounts]. Do poprzedniego zapytania na końcu dodaj: WHERE ([Date].[Calendar Year].&[2001]) Wykonaj zapytanie i przeanalizuj wynik. Co uzyskujemy za pomocą takiego zapytania? Poprzednią frazę WHERE zamień na poniższą: WHERE ({[Date].[Calendar Year].&[2001], [Date].[Calendar Year].&[2002]}) Ważne są tutaj nawiasy klamrowe { } ograniczają one kolekcję złożoną z kilku elementów oddzielonych przecinkiem. Bez tych nawiasów kolekcja zostanie potraktowanaa jako dwa osobne argumenty, a całe zapytanie zwróci błąd we frazie WHERE może być tylko jeden argument z danej hierarchii. Aby filtrować po wielu hierarchiach, należy kolekcje z różnych hierarchii oddzielić przecinkami: {[Measures].[Amount]} ON COLUMNS, Strona 7/15
5. Kolekcja elementów 6. Funkcja Children {[Account].[Account Number]} ON ROWS FROM [Finance] WHERE ({[Date].[Calendar Year].&[2001], Kolekcję tworzymy za pomocą wymieniania wszystkich jej składowych po przecinku, kolekcja musi być ujęta w nawiasy {}. Wpisz zapytanie: {[Measures].[Order Count], {[Product].[Product Line].&[S], Wpisz zapytanie: {[Product].[Product Line].&[Accessory], Elementy nie zostały odnalezione, dlatego w wyniku nie ma żadnych wierszy. Wpisz ponownie zapytanie: {[Product].[Product Line].[Accessory], Wykonaj powyższe zapytanie. Można wymienić wszystkie elementy należące hierarchii, poziomu lub elementu poprzez Children. { { [Date].[Calendar Year].&[2002]}, {[Organization].[Organizations].[Northwest Division]}, {[Department].[Departments].[Quality Assurance], [Department].[Departments].[Research [Department].[Departments].[Sales and Marketing]}) [Measures].[Sales Amount]} ON COLUMNS, [Product].[Product Line].&[M]} ON ROWS Jak można zauważyć, kody &[S] i &[M] zostały przetłumaczone na konkretne elementy linii produktu. Można się zastanowić, czy kody tych elementów są dostępne poprzez ich nazwy. [Product].[Product Line].&[Mountain]} ON ROWS [Product].[Product Line].[Mountain]} ON ROWS Tym razem zapytanie wykonało się i zostały pobrane elementy o nazwie wskazanej w zapytaniu. Ważne jest zrozumienie różnicy pomiędzy wymiarem, hierarchią i elementem. W prezentowanym wyżej przykładzie [Product] jest nazwą wymiaru, [Product Line] jest nazwą poziomu, a [Accessory] jest to element na konkretnym poziomie. Jeżeli poziom jest bezpośrednio pod wymiarem, a nie pod hierarchią, to do danego elementu poziomu można odwołać się za pomocą [Nazwa wymiaru].[nazwa elementu], zamiast [Nazwa wymiaru].[nazwa poziomu].[nazwa elementu]. [Wymiar].Children } [Poziom w wymiarze].children } and Development], do danego wymiaru, zastosowanie funkcji Strona 8/15
{ [Hierarchia].Children } { [Element].Children } Uwaga! W dalszej części ćwiczenia dla wielu funkcji pokażemy możliwość użycia ich w odniesieniu do wymiaru. W większości przypadków jest to ograniczone do wymiarów, dla których jest tylko jeden poziom lub jedna hierarchia. Dla wymiarów z wieloma poziomami lub hierarchiami nie ma możliwości i użycia tych funkcji. Wpisz zapytanie: {[Product].[Category].Children} ON ROWS Funkcja Children nie może być użyta do poziomów w hierarchii, dlatego niepoprawne jest zastosowanie funkcji Children do [Category] położonego w hierarchii [Product Categories]: Wpisz i wykonaj zapytanie: {[Product].[Product Categories].[Category].Children} ON ROWS Powyższy przykład nie wykona się. Poprawne zastosowanie funkcji Children: {[Product].[Product Line].Children} ON ROWS Wymiar Date posiada kilka poziomów (Day Name, Month of Year, Day of Year), spróbuj użyć funkcji Children do każdego z tych poziomów: {[Date].[Day Name].Children} ON ROWS Funkcję Children można użyć do elementu w hierarchii jak na przykładzie poniżej: {[Product].[Product Categories].[Category].[Accessories].Children} ON ROWS Wpisz zapytanie: {[Date].[Month of Year].[January].Children} ON ROWS Przy używaniu funkcji Children do elementu należy sprawdzić, czy dany element posiada elementy leżące niżej w hierarchii, przykładem jest zapytanie o elementy należące do January zapytanie nie zwróci żadnych wierszy. Można zauważyć, że January nie posiada żadnych Strona 9/15
7. Przykłady dla funkcji Children elementów leżących na niższym poziomie, ponieważ jest to poziom leżący bezpośrednio w wymiarze Date. Poziom leżący w hierarchii może posiadać poziomy leżące poniżej w hierarchii (o ile nie jest to poziom położony na samym dole), w takim wypadku funkcja Children zwróci konkretne elementy. Wpisz zapytanie: {[Date].[Fiscal].[Month].[January 2003].Children} ON ROWS Przykłady użycia funkcji Children dla wymiaru, hierarchii, poziomu i elementu: {[Sales Channel].Children} ON ROWS {[Sales Territory].[Sales Territory].Children} ON ROWS {[Sales Territory].[Sales Territory Country] ].Children} ON ROWS 8. Zadanie kontrolne 9. Funkcja Members {[Sales Territory].[Sales Territory].[Sales Territory Group].&[Europe].Children} ON ROWS Napisz raport przedstawiający całkowity koszt produktu (Total Product Cost) i podatek (Tax Amount) dla kostki Sales Summary w zależności od roku dostarczenia (wymiar: Delivery Date). Funkcja Members zwraca wszystkie elementy w danym wymiarze, hierarchii lub poziomie, łącznie z elementemm sumującym wszystkie dane (zazwyczaj [All]). Dla poziomów lub elementów w hierarchii, funkcja Members zwraca wszystkie elementy leżące poniżej (nie tylko na tym samym poziomie). Wpisz zapytanie { [Wymiar].Members } { [Poziom w wymiarze].members } { [Poziom w hierarchii].members } { [Hierarchia].Members } Strona 10/15
10. Przykłady dla funkcji Members Przykład zastosowania funkcji Members: {[Product].[Subcategory].Members} ON ROWS Members tym różni się od Children, że Members można stosować tylko dla wymiaru (jeżeli dla wymiaru jest tylko jeden poziom lub jedna hierarchia), hierarchii lub poziomu, a nie dla elementu. Wpisz zapytanie: {[Sales Channel].Members} ON ROWS Members dla hierarchii: {[Measures].[Order Count], [Measures].[Sales Amount]} ON COLUMNS, {[Sales Territory].[Sales Territory].Members} ON ROWS Members dla poziomu w wymiarze: {[Sales Territory].[Sales Territory Country] ].Members} ON ROWS Members dla poziomu w hierarchii: {[Sales Territory].[Sales Territory Country] ].Members} ON ROWS Natomiast NIE jest prawidłowe zapytanie (funkcja Members zastosowana do elementu w hierarchii, a nie do hierarchii): {[Measures].[Order Count], [Measures].[Saless Amount]} ON COLUMNS, {[Sales Territory].[Sales Territory].[Sales Territory Group].&[Europe].Members} ON ROWS Przy czym dla funkcji Children prawidłowe jest: {[Measures].[Order Count], [Measures].[Saless Amount]} ON COLUMNS, {[Sales Territory].[Sales Territory].[Sales Territory Group].&[Europe].Children} ON ROWS Przykłady dla funkcji Members: {[Delivery Date].[Day of Year].Members} ON ROWS Strona 11/15
{[Promotion].[Promotions].[Promotion Category].Members} ON ROWS 11. Funkcja Members dla agregatów 12. Members dla poziomu w wymiarze i hierarchii {[Promotion].[Promotions].Members} ON ROWS Zamiast wypisywania wszystkich agregatów możesz użyć funkcji Members dla [Measures], tak jak to pokazane w poniższym przykładzie: {[Measures].Members} ON COLUMNS, {[Promotion].[Promotion Type].Members} ON ROWS Wykonaj powyższe zapytanie. Poziomy mogą być bezpośrednio pod wymiarem, lub uporządkowane w hierarchii. Należy jednak zrozumieć różnicę pomiędzy uporządkowanymi elementami w hierarchii, gdzie każdy element może mieć elementy leżące poniżej w hierarchii lub leżące powyżej w hierarchii. W przypadku poziomu dla wymiaru, mamy różne elementy nieuporządkowane (bez rodziców i dzieci przyporządkowanych dla określonego elementu). W niektórych przypadkach, nie widać dużej różnicy (głównie dla poziomów najwyżej i najniżej w hierarchii). Wpisz poniższe zapytanie z funkcją Members zastosowaną dla poziomu w wymiarze (bez uporządkowania w hierarchii): {[Delivery Date].[Calendar Quarter of Year]..Members} ON ROWS Members zastosowane dla poziomu w hierarchii: {[Delivery Date].[Calendar].[Calendar Quarter].Members} ON ROWS Można się zastanowić, dlaczego tym razem każdy z kwartałów został wypisany kilka razy? Oczywiście zgodnie z opisem można się domyślać, że pierwsze zapytanie zwraca kwartały każdego roku razem: pierwsze kwartały każdego roku reprezentowane są w jednym wierszu. Drugie zapytanie zwraca wszystkie kwartały osobnoo każdy kwartał jest reprezentowany poprzez osobny wiersz. 13. Zadanie Dla kostki Sales Summary wypisz wszystkie agregaty w zależności od Strona 12/15
kontrolne 14. Fraza WHERE 15. Zadanie kontrolne 16. Funkcja FirstChild kategorii promocji, tylko dla daty dostarczenia w 2002 roku. Fraza WHERE może być użyta do zapytań w których na osiach znajdują się kolekcje, wtedy agregat w komórkach określany jest we frazie WHERE. Wpisz zapytanie: {[Product].[Product Line].Children} ON COLUMNS, {[Date].[Fiscal Year].Children} ON ROWS WHERE ([Measures].[Sales Amount]) Wykonaj powyższe zapytanie. Napisać zapytanie wyświetlające liczbę zamówionych jednostek (Order Quantity) w zależności od kategorii produktu (oś X) i kanału sprzedaży (oś Y - Sales Channel) dla kostki Sales Summary. Aby zapytać się tylko o pierwsze dziecko, użyj funkcji FirstChild. [Hierarchia].FirstChild [Poziom].FirstChild [Element w hierarchii].firstchild Przykłady dla FirstChild: {[Sales Territory].[Sales Territory].FirstChild} ON ROWS {[Sales Territory].[Sales Territory Country] ].FirstChild} ON ROWS 17. Funkcja LastChild {[Sales Territory].[Sales Territory].[Sales Territory Group].&[Europe].FirstChild} ON ROWS Analogicznie, aby zapytać się tylko o ostatnie dziecko, użyj funkcji LastChild. [Hierarchia].LastChild [Poziom].LastChild [Element w hierarchii].lastchild Przykład dla LastChild: {[Sales Territory].[Sales Territory Country] ].LastChild} ON ROWS Strona 13/15
18. Funkcja DefaultMember 19. Funkcja UnknownMember 20. Zadanie kontrolne Aby zapytać się tylko o domyślne dziecko z danej hierarchii, użyj funkcji DefaultMember. [Hierarchia].DefaultMember [Poziom].DefaultMember Elementy domyślne zostały ustawione w fazie projektowania kostki i wymiarów. Przykład dla DefaultMember: {[Sales Territory].[Sales Territory Country] ].DefaultMember} ON ROWS W kostkach każda dana agregacyjna jest przypisana do określonego elementu dla wszystkich wymiarów. Jeżeli z pewnych względów nie da się przypisać elementu do faktu, tworzy się element niezdefiniowany. Aby wyświetlić element niezdefiniowany dla określonego poziomu, należy użyć funkcji UnknownMember. [Wymiar].UnknownMember [Hierarchia].UnknownMember [Poziom].UnknownMember Elementy niezdefiniowane zostały ustawione kostki i wymiarów. Wpisz zapytanie z przykładem użycia funkcji UnknownMember: {[Measures].Members} ON COLUMNS, {[Product].[Model Name].UnknownMember} ON ROWS Wykonaj powyższe zapytanie. w fazie projektowania Napisz zapytanie wyświetlające podatek (Tax Amount) dla pierwszego, ostatniego i domyślnego roku dostarczenia dla kostki Sales Summary. Strona 14/15
Laboratorium rozszerzone Do podejmowania decyzji potrzebne są przekrojowe dane, które powinny być dostępne dla użytkowników biznesowych. Z tego powodu należy przygotować szereg raportów w postaci zapytań MDX gotowych do uruchomienia (poprzez przeglądarkę lub bezpośrednio w SQL Server Management Studio). Przedstawione niżej zadania są raportami, które pochodzą od użytkowników biznesowych. Laboratorium rozszerzone zawiera raporty do wykonania. Każde zadanie jest niezależne, zadania zostały ustawione od najłatwiejszych do najtrudniejszych. Dla każdego zadania podany jest orientacyjny czas wykonania. Wykonaj następujące raporty w języku MDX: Zadanie 1 (czas wykonania 8 min) Dla kostki Finance wypisz wszystkie agregaty dla scenariuszy. Zadanie 2 (czas wykonania 8 min) Dla kostki Finance wypisz Amount w zależności od docelowej waluty. Zadanie 3 (czas wykonania 8 min) Dla kostki Finance wypisz Amount dla wszystkich typów konta (oś X) i scenariuszy (oś Y). Zadanie 4 (czas wykonania 10 min) Dla kostki Finance wypisz pierwszy, ostatni i domyślny element dla poziomu kwartału w hierarchii [Fiscal]. Zadanie 5 (czas wykonania 10 min) Dla kostki Finance wypisz wszystkie agregaty względem scenariuszy (tylko dla roku 2002 i 2003). Strona 15/15