Analityczny język zapytań MDX: podstawy

Podobne dokumenty
Analityczny język zapytań MDX: zaawansowane

Analityczny język zapytań MDX: wstęp

OnLine Analytical Processing (OLAP) Kostki OLAP i zapytania MDX

Integracja i Eksploracja Danych

Kostki OLAP i język MDX

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

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

Autor: Joanna Karwowska

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

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

Usługi analityczne budowa kostki analitycznej Część pierwsza.

Przestrzenne bazy danych Podstawy języka SQL

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

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

Wykład 5. SQL praca z tabelami 2

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

Symfonia Produkcja. Kreator raportów. Wersja 2013

Krzysztof Dembczyński. Inteligentne Systemy Wspomagania Decyzji Studia magisterskie, semestr I Semestr letni 2007/08

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

Ćwiczenie zapytań języka bazy danych PostgreSQL

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

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Program szkoleniowy Efektywni50+ Moduł V Raportowanie dla potrzeb analizy danych

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Wprowadzenie do języka SQL

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

Wyświetl imie i nazwisko ucznia, nazwę przedmiotu z którego otrzymał ocenę niedostateczną. Nazwij tę kwerendę oceny niedostateczne.

Oracle11g: Wprowadzenie do SQL

Cel przedmiotu. Wymagania wstępne w zakresie wiedzy, umiejętności i innych kompetencji 1 Język angielski 2 Inżynieria oprogramowania

Podstawowe zapytania SELECT (na jednej tabeli)

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

Procedury techniczne modułu Forte Kontroling. Pakiety DTS

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

SQL (ang. Structured Query Language)

Wprowadzenie do hurtowni danych

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Technologie baz danych

Aplikacje Internetowe

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

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

Relacyjne bazy danych. Podstawy SQL

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Autor: Joanna Karwowska

Część I Istota analizy biznesowej a Analysis Services

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

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

Optimed24 Instrukcja ogólna

SQL Server Configuration Manager centrum dowodzenia

Program Rabator dla Microsoft Windows.

3. Podzapytania, łączenie tabel i zapytań

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Ulotka skrócona Moduł Analizy BI. Wersja:

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

Nowy interfejs w wersji 11.0 C8 BETA

Wykład 6. SQL praca z tabelami 3

Leszek Stasiak Zastosowanie technologii LINQ w

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

Wprowadzenie do programowania

TEMAT ĆWICZENIA Zapoznanie z technologią LINQ

Wstęp Wprowadzenie do BD Podstawy SQL. Bazy Danych i Systemy informacyjne Wykład 1. Piotr Syga

System imed24 Instrukcja Moduł Analizy i raporty

Microsoft SQL Server Podstawy T-SQL

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Relacyjne bazy danych. Podstawy SQL

Wprowadzenie do baz danych

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Bazy danych. Plan wykładu. Zależności funkcyjne. Wykład 2: Relacyjny model danych - zależności funkcyjne. Podstawy SQL.

Systemy GIS Tworzenie zapytań w bazach danych

Moduł Handlowo-Magazynowy Zaawansowane analizy sprzedaży i zakupu

PODZAPYTANIE (SUBSELECT)

Programowanie obiektowe

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

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

5.5. Wybieranie informacji z bazy

Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus

SQL praca z tabelami 4. Wykład 7

BAZY DANYCH laboratorium 2 tworzenie bazy danych, podstawy języka SQL

ZACHODNIOPOMORSKI UNIWERSYTET TECHNOLOGICZNY

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Problemy techniczne SQL Server

Plan. Wyświetlanie n początkowych wartości (TOP n) Użycie funkcji agregujących. Grupowanie danych - klauzula GROUP BY

ANALYSIS SERVICES. 1. Tworzymy połączenie ze źródłem danych. 2. Tworzymy nowy widok dla źródła danych

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

BAZA_1 Temat: Tworzenie i modyfikowanie formularzy.

Język SQL. Rozdział 2. Proste zapytania

Modelowanie obiektowe - Ćw. 1.

Makra w arkuszu kalkulacyjnym

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski SYSTEMY SCADA

Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

5. Uruchomienie SQL Server Business Intelligence Development Studio Menu Start -> SQL Server Business Intelligence Development Studio

Systemy Baz Danych. Lista 1

Autor: dr inż. Katarzyna Rudnik

Ocenianie opisowe Optivum. Jak przygotować i wydrukować świadectwa lub arkusze ocen?

Transkrypt:

ITA-102 Hurtownie Danych Moduł 7 Wersja 1.0 Spis treści Analityczny język zapytań MDX: podstawy Analityczny język zapytań MDX: podstawy... 1 Informacje o module... 2 Przygotowanie teoretyczne... 4 Podstawy teoretyczne... 4 Porady praktyczne... 5 Uwagi dla studenta... 5 Dodatkowe źródła informacji... 6 Laboratorium podstawowe... 7 Laboratorium rozszerzone... 16 Zadanie 1 (czas wykonania 10 min)... 16 Zadanie 2 (czas wykonania 10 min)... 16 Zadanie 3 (czas wykonania 12 min)... 16 Zadanie 4 (czas wykonania 12 min)... 16 Zadanie 5 (czas wykonania 15 min)... 16

Informacje o module Opis modułu W module poznasz zaawansowane zapytania MDX operujące na wielowymiarowych kostkach danych. Projektowane zapytania są analityczne i przekrojowe, korzystają z wielu funkcji języka MDX: Cousin, Distinct, Except, DrillDownLevel, NonEmpty, Order, TopCount, BottomCount, Filter. W module znajdziesz informacje o operacjach na zbiorach wielowymiarowych i zastosowanie funkcji CrossJoin, NonEmptyCrossJoin, a także operatora iloczynu kartezjańskiego (*). Przedstawione są także metody tworzenia nowych agregatów i elementów kalkulowanych na podstawie istniejącej struktury. W ostatniej części modułu jest pokazana metoda wydobywania atrybutów dla poziomów za pomocą funkcji Properties i CurrentMember. Cel modułu Celem modułu jest nauczenie projektowania skomplikowanych, przekrojowych raportów i analiz korzystając z języka MDX, a także definiowania nowych agregatów i elementów na podstawie istniejących. Uzyskane kompetencje Po zrealizowaniu modułu będziesz: znał zaawansowane funkcje języka MDX potrafił wykorzystać język MDX do budowania skomplikowanych, przekrojowych raportów analitycznych używać funkcji CrossJoin i NonEmptyCrossJoin do uzyskania wielu hierarchii na jednej osi wynikowej potrafił definiować nowe agregaty i elementy na podstawie istniejących wydobywał informacje o właściwościach dla poziomów Wymagania wstępne Przed przystąpieniem do pracy z tym modułem powinieneś: znać składnię języka MDX potrafić utworzyć kolekcję elementów poprzez wyliczenie umieć zastosować podstawowe funkcje języka MDX: Children, Members, FirstChild, LastChild, DefaultMember potrafić zastosować frazę WHERE zarówno jako wymiar przecięcia, jak i do definicji agregacji w krotkach wynikowych Strona 2/16

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 4, 5, 6. Rys. 1 Mapa zależności modułu Strona 3/16

Przygotowanie teoretyczne Podstawy teoretyczne 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>) 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 (WARUNEK) Kolekcję można również wyrazić poprzez: { [Wymiar].[Poziom].&[Element 1], [Wymiar].[Poziom].&[Element 2] } 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]) } Strona 4/16

{ 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 ) ) } Składnia funkcji Children: { [Wymiar].Children } { [Poziom w wymiarze].children } { [Hierarchia].Children } { [Element].Children } Składnia funkcji Members: { [Wymiar].Members } { [Poziom w wymiarze].members } { [Poziom w hierarchii].members } { [Hierarchia].Members } Składnia funkcji FirstChild: [Hierarchia].FirstChild [Poziom].FirstChild [Element w hierarchii].firstchild Składnia funkcji LastChild: [Hierarchia].LastChild [Poziom].LastChild [Element w hierarchii].lastchild Składnia funkcji DefaultMember: [Hierarchia].DefaultMember [Poziom].DefaultMember 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: znasz składnię języka MDX, rozumiesz różnice pomiędzy wymiarem, hierarchią, poziomem, atrybutem, agregatem i elementem, Strona 5/16

potrafisz napisać proste zapytanie MDX korzystając z takich funkcji jak: Children, Members, Cousin, FirstChild, LastChild, DefaultMember. 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. 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 6/16

Laboratorium podstawowe Na wstępnie zaprezentujemy połączenie do kostki danych. Kolejno omówimy podstawowe funkcje przypominając ich składnię. Następnie przejdziemy do omawiania zaawansowanych funkcji języka. Na końcu ćwiczenia są zadania do samodzielnego wykonania. Zadanie 1. Połączenie do bazy 2. Funkcja Cousin 3. Funkcja Distinct Tok postępowania 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 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. Można użyć funkcji Cousin aby wyznaczyć element w hierarchii na tym samym poziomie i miejscu (kolejności), ale dla innego rodzica. Cousin( [Element], [Element na wyższym poziomie] ) Obydwa argumenty funkcji Cousin muszą być w tej samej hierarchii, natomiast nie muszą się różnić tylko jednym poziomem. W poniższym przykładzie [Canada] jest pierwszym państwem w [North America], dlatego zostanie wyznaczone pierwsze państwo w [Europe]. {[Measures].[Sales Amount]} ON COLUMNS, {Cousin([Sales Territory].[Sales Territory]..[Sales Territory Country].&[Canada], [Sales Territory].[Sales Territory].[Sales Territory Group].&[Europe])} ON ROWS Przykład dla Cousin z wykorzystaniem wymiaru daty: {[Measures].[Sales Amount]} ON COLUMNS, {Cousin([Delivery Date].[Calendar].[Calendar Quarter].&[2001]&[3], Wykonaj powyższe zapytania. Distinct( KOLEKCJA ) [Delivery Date].[Calendar].[Calendar Year].&[2003])} ON ROWS Funkcja Distinct pozwala na eliminację powtórzonych elementów w zbiorze. Wszystkie elementy kolekcji powinny być na tym samym poziomie lub z tej samej hierarchii. W poniższym przykładzie element [Bike Racks] nie zostanie wypisany dwa razy, tylko jeden raz. {[Measures].[Sales Amount]} ON COLUMNS, Strona 7/16

4. Funkcja Except 5. Zadanie 6. Funkcja DrillDownLevel {Distinct({[Product].[Product Model Categories].[Category].[Accessories].Children, [Product].[Product Model Categories].[Subcategory].[Bike Racks]})} ON ROWS Wykonaj powyższe zapytania. Aby wykonać różnicę dwóch zbiorów, należy użyć funkcji Except: Except( KOLEKCJA, KOLEKCJA ) Z kolekcji podanej jako pierwszy parametr usuwane są wszystkie elementy należące do kolekcji podanej jako drugi parametr. W podanym niżej przykładzie wyświetlamyy wszystkie kategorie produktu bez kategorii [Bikes]. {[Measures].[Sales Amount]} ON COLUMNS, {Except({[Product].[Category].Children}, {[Measures].[Sales Amount]} ON COLUMNS, {Except({[Product].[Product Model Lines].[Model Name].Members}, {[Product].[Product Model Lines].[Product Line].[Accessory].Children})} ON ROWS Wykonaj powyższe zapytania. Dla kostki Sales Summary wypisać wszystkie agregaty dla podkategorii produktu bez podkategorii: [Cleaners],[Fenders],, [Helmets]. DrillDownLevel( [Wymiar] ) DrillDownLevel( [Poziom] ) DrillDownLevel( [Element] ) {[Product].[Category].[Bikes]} )} ON ROWS Poniżej przykład, w którym wyświetlamy wszystkie modele produktu oprócz tych, które należą do linii [Accessory]. Do zapytania wykorzystywana jest hierarchia [Product Model Lines]. W pierwszym parametrze funkcji Except do wyciągania elementów używamy funkcji Members (nie można użyć tutaj funkcji Children), ponieważ poziom [Model Name] jest w hierarchii. Drugi parametr zawiera funkcję Children (nie można użyć tutaj funkcji Members), ponieważ [Accessory] jest to element na poziomie [Product Line]. Za pomocą DrillDownLevel możemy wyświetlić elementy znajdujące się poniżej określonego poziomu. Poniższe zapytanie wyświetli wszystkie kategorie produktu, a także wszystkie podkategorie (w tej hierarchii pod poziomem [Category] znajduje się poziom [Subcategory]). Strona 8/16

7. Zadanie 8. Funkcja NonEmpty 9. Zadanie 10. Funkcja Order {[Measures].[Sales Amount]} ON COLUMNS, {DrillDownLevel([Product].[Product Categories].[Category])} ON ROWS Przeanalizuj poniższe przykłady użycia DrillDownLevel dla wymiaru, poziomu w wymiarze, poziomu w hierarchii, hierarchii, elementu w wymiarze, elementu w hierarchii. DrillDownLevel( [Sales Channel] ) DrillDownLevel( [Product].[Category] ) DrillDownLevel( [Product].[Product Categories].[Category] ) DrillDownLevel( [Product].[Product Categories] ) DrillDownLevel( [Product].[Category].[Accessories] ) DrillDownLevel( [Product].[Product Categories].[Category].[Accessories] ) Wykonaj powyższe zapytania. Przykłady z DrillDownLevel wklej do pierwszego przykładu i wykonaj. Dla kostki Sales Summary dla wszystkich kategorii, podkategorii i produktów wypisz liczbę jednostek sprzedanych, uwzględnij tylko rok 2003. W przypadku wielu elementów w zbiorze zdarza się, że część elementów nie posiada danych i komórki są wypełniane wartością (null). Aby usunąć elementy, dla których wszystkie wartości agregacji są puste, należy użyć funkcji NonEmpty. NonEmpty( KOLEKCJA ) Przykładowe zapytanie: {[Measures].[Sales Amount],[Measures].[Tax Amount]} ON COLUMNS, {NonEmpty([Product].[Model Name].Children)} ON ROWS Wykonaj powyższe zapytanie. Dla kostki Sales Summary wyświetlić liczbę zamówień i podatek w zależności od roku i kwartału. Nie wypisywać kwartałów, dla których nie ma zamówień. Aby posortować elementy zbioru względem pewnego agregatu, należy użyć funkcji Order: Order( KOLEKCJA, [Agregat], TYP_SORTOWANIA ) Dostępne są cztery typy sortowania: ASC, DESC, BASC, BDESC. Dwa pierwsze typy sortują tylko w ramach jednej określonej hierarchii, kolejne dwa służą do sortowania ze złamaniem hierarchii (Break hierarchy). Przykład dla Order: {[Measures].[Sales Amount],[Measures].[Tax Amount]} ON COLUMNS, {Order([Product].[Category].Children, [Measures].[Sales Amount], DESC)} ON ROWS Strona 9/16

11. Zadanie 12. Funkcje TopCount i BottomCount 13. Zadanie 14. Funkcja Filter 15. Zadanie 16. Obiekty wielowymiarowe Wykonaj powyższe zapytanie. Dla kostki Sales Summary wyświetl całkowity koszt produktu i liczbę zamówionych jednostek w zależności od typu promocji. Wynik posortuj rosnąco wg całkowitego kosztu produktu. Funkcje TopCount i BottomCount sortują zbiór odpowiedni rosnąco i malejąco względem agregatu, a następnie wyświetlają tylko N pierwszych elementów: TopCount( KOLEKCJA, N, AGREGAT ) BottomCount( KOLEKCJA, N, AGREGAT ) Wpisz przykład dla TopCount pięć najlepszych produktów pod względem sprzedaży: {[Measures].[Sales Amount]} ON COLUMNS, {TopCount([Product].[Product].Children,5, [Measures].[Sales Amount])} ON ROWS Wpisz przykład dla BottomCount pięć najsłabiej sprzedających się produktów, nie są liczone produkty dla których nie zarejestrowano faktu sprzedaży: {[Measures].[Sales Amount]} ON COLUMNS, {BottomCount(NonEmpty([Product].[Product].Children),5, [Measures].[Sales Amount])} ON ROWS Wykonaj powyższe zapytania. Dla kostki Sales Summary wyświetl 2 najlepsze i 2 najgorsze kraje (Sales Territory Country) względem liczby sprzedanych jednostek wykonaj to za pomocą jednego zapytania. Podpowiedź: najpierw napisz to za pomocą dwóch zapytań, a następnie użyj przecinka aby utworzyć kolekcję: { A, B }. Funkcja Filter pozwala wybrać z kolekcji tylko te elementy, które spełniają pewien warunek. Filter( KOLEKCJA, WARUNEK ) Wpisz przykład dla funkcji Filter, gdzie rezultatem są produkty dla których liczba sprzedanych jednostek przekracza 1000: {[Measures].[Order Quantity]} ON COLUMNS, {Filter([Product].[Product].Children, [Measures].[Order Quantity]>1000)} ON ROWS Wykonaj powyższe zapytanie. Dla kostki Sales Summary wyświetl wszystkie agregaty tylko dla tych krajów dla których całkowity koszt produktu przekracza 7000000. Dotychczas rozpatrywaliśmy tylko przypadki, gdzie na jednej osi znajdują się elementy z jednej hierarchii (z jednego wymiaru lub Strona 10/16

17. Funkcja CrossJoin agregaty). W języku MDX jest możliwość operacji na zbiorach (dodawanie, różnica), ale także definiowanie iloczynu dwóch zbiorów i operacje na przestrzeniach wielowymiarowych. A = { a1, a2, a3 } B = { b1, b2 } A * B = { (a1,b1), (a1,b2), (a2,b1), (a2,b2), (a1,b1), (a3,b2) } Należy zauważyć, że operacja iloczynu kartezjańskiego z przyczyn praktycznych jest zapisywana symbolem gwiazdki (*). W języku MDX współrzędne każdego punktu podajemy w nawiasach okrągłych, punkty oddzielamy przecinkami, natomiast całą kolekcję ujmujemy w nawiasy klamrowe: A = { a1, a2, a3 } B = { b1, b2 } C = { c1, c2, c3 } { (a1, b2, c1), (a3, b2, c2), (a2, b1, c3) } Ważna jest informacja, że elementy są tego samego typu jeżeli należą do jednego lub różnych poziomów tej samej hierarchii jednego wymiaru lub do jednego poziomu danego wymiaru nie należącego do żadnej hierarchii. Należy sprawdzić, czy każdy punkt posiada odpowiednie wymiary jako kolejne współrzędne. Niepoprawne są przykłady: { (a1), (b2) } // inny wymiar jako pierwszy element { (a1, b2), (a1, b3, c1) } // punkty mają inną liczbę wymiarów { (a1, b2), (b1, a3) } // zmieniona kolejność wymiarów Przykłady zbiorów z elementami o takim samymm typie: Z1 = {[Product].[Product Categories].[Category].[Accessories], [Product].[Product Categories].[Category].[Bikes], [Product].[Product Categories].[Subcategory]..[Bike Racks], [Product].[Product Categories].[Product Name] ].[Touring Rear Wheel]} Z2 = {[Product].[Style].[Men] [Product].[Style].[Not Applicable] [Product].[Style].[Womens]} Pierwszy przykład dotyczy wymiaru [Product] i hierarchii [Product Categories] (różne poziomy), natomiast drugi przykład dotyczy wymiaru [Product] i poziomu [Style] (poziom bezpośrednio pod wymiarem). {[Measures].Members} ON COLUMNS, {([Promotion].[Promotion Type].&[Discontinued Product], [Product].[Product Categories].[Category]..&[4]), ([Promotion].[Promotion Type].&[New Product] ], [Product].[Product Categories].[Product Name].&[447])} ON ROWS Wykonaj powyższe zapytanie. Funkcja CrossJoin pozwala na wykonanie iloczynu kartezjańskiego dwóch zbiorów. Pozwala to na umieszczenie wielu elementów Strona 11/16

i operator * 18. Funkcja NonEmptyCrossJo in z różnych hierarchii na jednej osi. CrossJoin( KOLEKCJA, KOLEKCJA ) KOLEKCJA * KOLEKCJA Wpisz przykład dla CrossJoin wyświetlający wszystkie agregaty dla kostki Sales Summary w zależności od kategorii promocji i kanału sprzedaży: {[Measures].Members} ON COLUMNS, {CrossJoin([Promotion].[Promotion Category].Children, Powyższe zapytanie jest równoważne: {[Measures].Members} ON COLUMNS, {[Promotion].[Promotion Category].Children * [Sales Channel].[Sales Channel].Children} ON ROWS Jest to równoważne zapytaniu: {[Measures].Members} ON COLUMNS, {[Promotion].[Promotion Category].&[Customer] ], [Promotion].[Promotion Category].&[No Discount], [Promotion].[Promotion Category].&[Reseller] ]} * {[Sales Channel].[Sales Channel].&[Internet], [Sales Channel].[Sales Channel].&[Reseller]} ON ROWS A także równoważne: {[Measures].Members} ON COLUMNS, {{([Promotion].[Promotion Category].&[Customer], [Sales Channel].[Sales Channel].Children)} ON ROWS [Sales Channel].[Sales Channel].&[Internet]), ([Promotion].[Promotion Category].&[Customer], [Sales Channel].[Sales Channel].&[Reseller]), ([Promotion].[Promotion Category].&[No Discount], [Sales Channel].[Sales Channel].&[Internet]), ([Promotion].[Promotion Category].&[No Discount], [Sales Channel].[Sales Channel].&[Reseller]), ([Promotion].[Promotion Category].&[Reseller], [Sales Channel].[Sales Channel].&[Internet]), ([Promotion].[Promotion Category].&[Reseller], [Sales Channel].[Sales Channel].&[Reseller])}} ON ROWS Wykonaj powyższe zapytania. Funkcja NonEmptyCrossJoin: NonEmptyCrossJoin( KOLEKCJA, KOLEKCJA ) Funkcja ta działa tak samo jak połączenie: NonEmpty( CrossJoin( KOLEKCJA, KOLEKCJA ) ) 19. Zadanie Wyświetl wszystkie agregaty dla kostki Sales Summary w zależności od Strona 12/16

20. Łączenie agregatów z hierarchiami 21. Składnia WITH MEMBER AS dla agregatów 22. Zadanie 23. Składnia WITH MEMBER AS dla elementów kategorii produktu i roku dostarczenia. Posortuj względem liczby jednostek sprzedanych wykonaj zapytanie raz z ASC i raz z BASC jako typ sortowania. Do tej pory były analizowane przykłady, w których na kolumnach były wyświetlane agregaty, natomiast w kolejnych wierszach odpowiednie elementy w hierarchii. Możliwe jest połączenie agregatów z hierarchiami, tak jak w poniższym przykładzie. {CrossJoin({[Measures].[Sales Amount], [Measures].[Extended Amount]}, {[Promotion].[Promotion Category].Children})} ON COLUMNS, {[Sales Channel].[Sales Channel].Children} ON ROWS Wykonaj powyższe zapytanie. Aby dodać nowy agregat kalkulowany należy użyć frazy WITH MEMBER AS: WITH MEMBER [Measures].[Nowy agregat] AS ' WYRAZENIE ' W zapytaniu można już użyć agregatu wraz z agregatami kostki: { [Measures]..., [Measures].[Nowy Agregat] } ON COLUMNS,... W poniższym przykładzie obliczamy średnią liczbę zamówionych produktów przypadających na jedno zamówienie. WITH MEMBER [Measures].[Average Units Count] AS '[Measures].[Order Quantity]/[Measures].[Order Count]' {[Measures].[Order Quantity], [Measures].[Average Units Count]} ON COLUMNS, {[Product].[Product Categories].[Category].Members} ON ROWS Wykonaj powyższe zapytanie. Dla kostki Sales Summary zdefiniuj nowy agregat [Tax Percentage] jako iloraz [Tax Amount] / [Total Product Cost]. Wyświetl ten agregat względem roku, semestru i kwartału dostarczeniaa (oś X), a także kanału sprzedaży [Sales Channel] i kraju sprzedaży [Sales Territory Country] (oś Y). Podobnie jak dodawanie nowego agregatu, można dodać nowy element definiując działania, jakie zostaną wykonane dla obliczanych agregatów: WITH MEMBER [Wymiar].[Poziom].[Nowy element] AS ' WYRAZENIE ' WITH MEMBER [Wymiar].[Hierarchia].[Nowy element] AS ' WYRAZENIE ' W poniższym przykładzie definiujemy nowy element na poziomie [Product Line] o nazwie [Accessory and Components]. Strona 13/16

24. Funkcje Properties i CurrentMember WITH MEMBER [Product].[Product Line].[Accessory and Components] AS '[Product].[Product Line].[Accessory]+[Product].[Product Line].[Components]' {[Measures].[Order Count], [Measures].[Total Product Cost]} ON COLUMNS, {[Product].[Product Line].[Accessory and Components]} ON ROWS Kolejny przykład prezentuje przykład wykorzystania WITH MEMBER AS dla hierarchii: WITH MEMBER [Delivery Date].[Fiscal].[Last Three Quarters of 2002] AS '[Delivery Date].[Fiscal].[Fiscal Quarter].[Q2 FY 2002]+[Delivery Date].[Fiscal].[Fiscal Quarter].[Q3 FY 2002]+ +[Delivery Date].[Fiscal].[Fiscal Quarter].[Q4 FY 2002]' {[Measures].[Order Count], [Measures].[Total Product Cost]} ON COLUMNS, {[Delivery Date].[Fiscal].[Last Three Quarters of 2002]} ON ROWS Kolejny przykład dotyczy elementu zdefiniowanego jako różnica dwóch elementów na różnych poziomach, ale w jednej hierarchii. WITH MEMBER [Delivery Date].[Fiscal].[2003 withoutt January] AS '[Delivery Date].[Fiscal].[Fiscal Year].[FY 2003]-[Delivery Date].[Fiscal].[Month].[January 2003]' {[Measures].[Order Count], [Measures].[Total Product Cost]} ON COLUMNS, {[Delivery Date].[Fiscal].[2003 without January]} ON ROWS Wykonaj powyższe zapytanie. Poziomy mogą zawierać właściwości, które są przypisane dla każdego elementu. Właściwości są to dane na temat elementu, które nie muszą tworzyć logicznie kolejnego poziomu. [Wymiar].Properties("Wlasnosc") [Hierarchia].Properties("Wlasnosc") [Poziom w wymiarze].properties("wlasnosc") [Poziom w hierarchii].properties("wlasnosc") Aby odczytać własności dla elementów, należy użyć funkcji Properties jak w podanym niżej przykładzie. WITH MEMBER [Measures].[Style] AS '[Product].[Product].Properties("Style")' {[Measures].[Style], Strona 14/16

25. Zadanie [Measures].[Order Quantity]} ON COLUMNS, {NonEmpty([Product].[Product].Children)} ON ROWS Określony wymiar dla agregatu odpowiada konkretnemu rozpatrywanemu elementowi w momencie wykonywania zapytania, można dodać funkcję CurrentMember aby uzmysłowić sobie jak wyznaczany jest określony atrybut. WITH MEMBER [Measures].[Days to Manufacture] AS '[Product].[Product].CurrentMember.Properties("Days to Manufacture")' MEMBER [Measures].[Dealer Price] AS '[Product].[Product].CurrentMember.Properties("Dealer Price")' {[Measures].[Days to Manufacture], [Measures].[Dealer Price], [Measures].[Order Quantity]} ON COLUMNS, {NonEmpty([Product].[Product].Children)} ON ROWS Wykonaj powyższe zapytania. Dla każdego produktu wyświetl kolor, klasę, rozmiar, status i liczbę jednostek sprzedanych dla kostki Sales Summary.. Strona 15/16

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 10 min) Dla kostki Finance wypisz wszystkie agregaty dla departamentów na wszystkich poziomach. Zadanie 2 (czas wykonania 10 min) Dla kostki Finance wypisz Amount dla wszystkich typów konta (oś X) i scenariuszy (oś Y). Zadanie 3 (czas wykonania 12 min) Dla kostki Sales Summary wypisz wszystkie agregaty dla lat, semestrów i kwartałów. Nie wypisuj danych dla roku 2002. Zadanie 4 (czas wykonania 12 min) Dla kostki Sales Summary wypisz Sales Amount i Total Product Cost i kategorię promocji (oś Y) w zależności od roku dostarczenia, kategorii produktu (oś X). Zadanie 5 (czas wykonania 15 min) Dla kostki Finance wypisz wszystkie agregaty dla organizacji do 3 poziomu, nie wypisuj organizacji z wartościami pustymi. Strona 16/16