11. srpna 2015

MDX tutorial 5 – Setové funkce


Dnešní díl přichází opět trochu se zpožděním, nějak moc práce před změnou práce a je potřeba dodělat všechny resty :). Musím tedy využít toho, že se mi na pozadí procesuje kostka u klienta k sepsání dalšího dílu tutoriálu. V minulých dílech MDX tutoriálu jsme se zabývali tvorbou počítaných členů http://www.neoral.cz/2015/05/mdx-tutorial-3-pocitane-cleny.html a aplikací v SSRS http://www.neoral.cz/2015/07/mdx-tutorial-4-aplikace-mdx-v-ssrs.html
Dnes začneme jednu velmi rozsáhlou kapitolu kterou budu muset rozbít do několika podkapitol. Čekají nás funkce v MDX. Než se dostaneme k navigaci a práci s časem, začnu kategorií funkcí setových.
Jako výchozí dotaz beru následující skript, který vybere všechny kategorie, podkategorie a modely produktů dohromady s prodeji
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
NON EMPTY
       [Dim Product].[Category].[Category]*
       [Dim Product].[Subcategory].[Subcategory]*
       [Dim Product].[Category-Subcategory-Model-Product].[Model]
ON ROWS
FROM [MDX Tutorial]

Začneme řazením
Order ({Set}, výraz [, FLAG])
V MDX byste hledali order by klauzuli marně, řadí se zde funkcí Order. Prvním argumentem je zde množina kterou chcete seřadit, druhý výraz podle kterého chceme řadit a na závěr FLAG jakým stylem chceme řadit. Výchozím flagem je ASC, čili vzestupné řazení. Pokud napíšeme dotaz
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
NON EMPTY
       ORDER(
       [Dim Product].[Category].[Category]*
       [Dim Product].[Subcategory].[Subcategory]*
       [Dim Product].[Category-Subcategory-Model-Product].[Model],
       [Measures].[Reseller Sales]
       ,asc
       )
ON ROWS
FROM [MDX Tutorial]

výsledky se zdají setřízené podivně.
Kategorie
Podkategorie
Model
Reseller Sales
Accessories
Bike Racks
Hitch Rack - 4-Bike
$197,736.16
Accessories
Bottles and Cages
Water Bottle
$7,476.60
Accessories
Cleaners
Bike Wash
$11,188.37
Accessories
Helmets
Sport-100
$258,712.93
Accessories
Hydration Packs
Hydration Pack
$65,518.75
Accessories
Locks
Cable Lock
$16,225.22
Accessories
Pumps
Minipump
$13,514.69
Accessories
Tires and Tubes
Patch kit
$925.21
Bikes
Mountain Bikes
Mountain-400-W
$592,450.05
Bikes
Mountain Bikes
Mountain-500
$1,067,327.31
Bikes
Mountain Bikes
Mountain-300
$1,907,249.38
Bikes
Mountain Bikes
Mountain-100
$8,568,958.27
Bikes
Mountain Bikes
Mountain-200
$14,356,699.36
Bikes
Road Bikes
Road-750
$966,079.59
Bikes
Road Bikes
Road-450
$1,874,406.52
Bikes
Road Bikes
Road-150
$2,363,805.16

Pozornému oku ale neunikne, že data setřízená jsou. Modely jsou setřízeny v rámci nadřazeného prvku v hierarchii. Modely jsou setřízeny v rámci nadřazené podkategorie.
ASC – řadí vzestupně v rámci parenta (nadřízeného prvku v hierarchii)
DESC – sestupně v rámci parenta
BASC – vzestupně bez ohledu na parenta
BDESC – sestupně bez ohledu na parenta
Pokud bychom tedy chtěli Modely od nejprodávanějšího po nejméně prodávaný, dotaz by vypadal následovně
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
NON EMPTY
       ORDER(
       [Dim Product].[Category].[Category]*
       [Dim Product].[Subcategory].[Subcategory]*
       [Dim Product].[Category-Subcategory-Model-Product].[Model],
       [Measures].[Reseller Sales]
       ,BDESC
       )
ON ROWS
FROM [MDX Tutorial]
Výsledek:
Category
Subcategory
Model
Reseller Sales
Bikes
Mountain Bikes
Mountain-200
$14,356,699.36
Bikes
Road Bikes
Road-250
$9,377,457.68
Bikes
Mountain Bikes
Mountain-100
$8,568,958.27
Bikes
Road Bikes
Road-650
$7,442,141.81
Bikes
Touring Bikes
Touring-1000
$6,723,794.29
Bikes
Road Bikes
Road-550-W
$3,668,383.88
Bikes
Road Bikes
Road-350-W
$3,665,932.31
Components
Mountain Frames
HL Mountain Frame
$3,365,069.27
Bikes
Road Bikes
Road-150
$2,363,805.16
Bikes
Touring Bikes
Touring-3000
$2,046,508.26

Další analytickou úlohou, která je občas potřeba provést je zjištění nejlepších, nejhorších. Jako bychom v SQL psali SELECT TOP 10 Model FROM Tabulka ORDER BY ResellerSales DESC
MDX opět nemá TOP N klauzuli, nýbrž použijeme funkci
TopCount({Set}, N ,[výraz])
Set je množina prvků za kterých chceme ty nejlepší, N je kolik, výraz podle kterého chceme vyhodnocovat (řazení probíhá bez ohledu na parenta)
Nejlepších 10 modelů podle internetových prodejů bych získal dotazem
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
NON EMPTY
       TOPCOUNT(
       [Dim Product].[Category].[Category]*
       [Dim Product].[Subcategory].[Subcategory]*
       [Dim Product].[Category-Subcategory-Model-Product].[Model],
       10
       ,[Measures].[Reseller Sales]
       )
ON ROWS
FROM [MDX Tutorial]
BottomCount({Set}, N ,[výraz])
Funguje obdobně jako TopCount, jenom z druhé strany. Pokud umažeme NON EMPTY dotaz vrátí 10 nejhorších včetně modelů, které se neprodávaly
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
       BOTTOMCOUNT(
       [Dim Product].[Category].[Category]*
       [Dim Product].[Subcategory].[Subcategory]*
       [Dim Product].[Category-Subcategory-Model-Product].[Model]
       ,10
       ,[Measures].[Reseller Sales]
       )
ON ROWS
FROM [MDX Tutorial]
Pokud by nám v dotazu před výrazem na řádcích NON EMPTY zůstalo, nevrátil by dotaz nic protože NON EMPTY se vyhodnotí až po BOTTOMCOUNT. Chceme-li tedy 10 nejslabších modelů, které se ale prodávaly musíme použít funkci NONEMPTY psanou dohromady. Dotaz by vypadal
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
       BOTTOMCOUNT(
             NONEMPTY(
             [Dim Product].[Category].[Category]*
             [Dim Product].[Subcategory].[Subcategory]*
             [Dim Product].[Category-Subcategory-Model-Product].[Model]
             ,[Measures].[Reseller Sales]
             )
       ,10
       ,[Measures].[Reseller Sales]
       )
ON ROWS
FROM [MDX Tutorial]
Pokud bychom chtěli získat z množiny N prvků ze začátku, případně z konce bez předchozího setřídění, můžeme použít funkce
Head({Set}, N ) – množina N prvků od začátku
Tail({Set}, N) – množina N prvků od konce
K čemu může být dobré vybírat N prvků bez ohledu na řazení? Tohle se může hodit při práci se semi-aditivními  měřítky stejně jako funkce Item. Práci se semi-aditivními měřítky a tudíž aplikaci těchto funkcí jsem popsal v článku http://www.neoral.cz/2015/05/semi-aditivni-meritka-v-ssas-pomoci-mdx.html
{Set}.Item(0) – vybere první položku množiny, funkce item převádí set na membera výběrem n-tého prvku
Další častou úlohou kterou čas od času, ne-li denně potřebujeme v SQL je filtrování dat. Už jsme si ukázali jak funguje WHERE klauzule, ale co když potřebuji vyfiltrovat data na modely s prodeji většími než je určitá částka, nebo najít modely obsahující klíčové slovo (SQL Like ekvivalent)
Pro tyto účely použijeme funkci Filter
Filter ({Set} ,  výraz)
Set je množina kterou chceme vyfiltrovat, výraz je podmínka, která musí být splněna. Z výkonových důvodů doporučuji funkci filter používat až na nonempty data zvlášť pokud se jedná o větší množství kombinací buněk. Pokud nedostanete Out of Memory exception počkáte si dlouho pokud nonempty nad většími daty nepoužijete.
Pokud bych chtěl najít modely s prodeji většími než 30 000, dotaz by vypadal následovně
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
       filter(
             nonempty(
                    [Dim Product].[Category].[Category]*
                    [Dim Product].[Subcategory].[Subcategory]*
                    [Dim Product].[Category-Subcategory-Model-Product].[Model]
                    ,[Measures].[Reseller Sales])
             ,[Measures].[Reseller Sales]>30000
       )
ON ROWS
FROM [MDX Tutorial]

Pokud bych chtěl použít v MDX ekvivalent SQL Like (který MDX opět nezná), potřebuji vlastně ve výskytu slova hledat řetězec. Zde můžu použít VBA funkci InStr(kde, co, [počátek hledání]). Pokud InStr najde, vrátí číselně pozici na kterém znaku text začíná, pokud nenajde vrátí 0. Dotaz pro filtrovaný seznam modelů které v textu obsahují klíčové slovo by vypadal
SELECT
       {[Measures].[Reseller Sales]}
ON COLUMNS,
       filter(
             nonempty(
                    [Dim Product].[Category].[Category]*
                    [Dim Product].[Subcategory].[Subcategory]*
                    [Dim Product].[Category-Subcategory-Model-Product].[Model]
                    ,[Measures].[Reseller Sales])
             , InStr([Dim Product].[Category-Subcategory-Model-Product].currentmember.name,"bike")>0
       )
ON ROWS
FROM [MDX Tutorial]
Závěr:
V dnešní kapitole jsme začali se setovými funkcemi. Ukázal jsem ty které sám nejčastěji používám a zdaleka to není všechno. Kostka je zprocesovaná :) a je opět skoro půlnoc. Vše napsat jedním dechem se nedá, takže v práci se sety budeme pokračovat v dalším dílu. Posvítíme na množinové operace a možná přidáme i nějaké další setové funkce.


30. července 2015

PowerBI desktop

V průběhu března jsem Vás informoval o dostupnosti komunitního preview pro veřejnost aplikace Power BI designer. Jedná se o deseigner PowerBI vše v jednom nezávislý na MS Office. Článek jsem psal zde: http://www.neoral.cz/2015/05/powerbi-nove-generace.html  V pátek 24.7.2015 jsme se dočkali „ostré verze“. PowerBI designer se nám přejmenoval na PowerBI Desktop. Změna názvu naštěstí není změnou jedinou. Výrazně se posunuly i funkce. Je PowerBI Desktop produkčně použitelný? Spoiler na začátek. Podle mě ano.
PowerBI Desktop můžete stáhnout z webu www.powerbi.com Zde po registraci, také máte k dispozici portálové řešení s datasety, reporty a dashboardy. Mezi položkami ke stažení přibyla nová verze PowerBI Gateway pro propojení on premise prostředí s portálem. Také jsou již k dispozici mobilní aplikace na platformy Windows, Android i iOS. Někteří možná ocení, že PowerBI desktop je dostupný v 42 jazycích včetně češtiny a slovenštiny.
Novinky v načítání dat
Načítání dat probíhá stále ala PowerQuery. PowerBI Desktop obsahuje konektory, které PowerQuery v sobě zatím nemá. Například Google Analytics, CRM Online, Git Hub, Zendesk a další. Přibyly některé nové transformace. Extrakce z textu od začátku, konce či z prostředku textu. U transformace Merge dotazů je možno definovat typ Joinu. 
Novinky v oblasti modelování
Od května můžeme přidávat DAX measures na agregované úrovni a DAX počítané sloupce. V nové verzi bylo překopáno diagramové zobrazení a zobrazení mřížky. Zobrazení mřížky (data view) obsahuje vyhledávač sloupců, sloupce lze skrýt ze zobrazení reportu. Zde mi malinko chybí možnost vybrat více sloupců zároveň a hromadně je skrýt. Zatím musíme po jednom (což je u 30ti sloupců otrava). Také by se hodila možnost vypnout automatickou sumu u číselných sloupců (jako jsou roky, či klíče). V reportu suma vypnout jde. V diagramovém zobrazení jdou zatím dělat pouze relace.
Novinky v oblasti vizualizace
Zde je novinek nejvíce a u některých skáču hlavou ke stropu s jásavým voláním „konečně“. To co nešlo a chybělo v PowerView, PowerBI desktop umí. Můžeme konečně uživatelsky měnit popisky grafů, map a dalších grafických prvků (Částka by město nevypadalo úplně dobře). V grafech, mapách atd můžeme měnit barvy (přece jen u dema s volbami modří komunisté vypadali taky trochu divně :) Celkově se rozšířily fomátovací možnosti lištou po pravé straně. Náhled designeru si můžete prohlédnout na obrázku analýzy návštěvnosti článků načtených z mého blogu přes Google analytics konektor. Dále přibyly nové typy grafů a datových regionů (Area chart, Waterfall, Donut, Matrix). Do reportů jdou vkládat vlastní textová pole a obrázky. Přibyla podpora pro hyperlinky.

Obecná vylepšení
Tlačítko zpět a vpřed se hodí i v jiných aplikacích. Designer si pamatuje poslední otevřené soubory a přímo z PowerBI Desktop můžeme publikovat hotové reporty do PowerBI.com. První vlaštovkou možnosti nasazení do on premise prostředí je Pyramid Server (Pyramid Analytics). Po publikaci do PowerBI.com se report objeví mezi reporty a můžete si vybrané prvky „přišpendlit“ na dahsboard. Zde je možno ukotvit i výsledky funkce otázky a odpovědi. PowerBI a jeho otázky a odpovědi budou podporovány v rámci Cortana Analytics (http://www.microsoft.com/en-us/server-cloud/cortana-analytics-suite/overview.aspx) tudíž se ve Windows 10 můžeme těšit i na hlasové rozpoznávání v rámci této funkce :) Aplikace pro mobily je taky poměrně příjemná a automatické aktualizace na webu PowerBI.com funkční bez dramatického nastavování. Nyní můžu sledovat návštěvnost Blogu (a mnohé další věci) s denní aktualizací na svém mobilu s Androidem a byl jsem mile překvapen jednoduchostí. To vše zdarma.
Slovo závěrem

Měsíční update PowerBI Desktopu považuji za stěžejní. Došlo k překlenutí mezi fází: „Je to dobré na hraní“ do fáze „Dá se to používat“. Kompletní seznam novinek v kontextu „Tak jde čas“ si můžete prohlédnout zde https://support.powerbi.com/knowledgebase/articles/489224-what-s-new-in-the-latest-power-bi-desktop-update Pár věcí sice ještě chybí (nenašel jsem například 2 osy v grafech), ale pokud Microsoft udrží tempo jakým produkt rozšiřuje, bude to příjemné :) Možná i časem vyměním Reporting Services. PowerView jsem už vyměnil určitě. Takže doporučuji nainstalovat a zkoušet :) 

24. července 2015

Úvod do Azure Machine Learning

Součástí Analytických služeb SQL Serveru je již po několik verzí Data Mining (od 2000). Azure Machine Learning je na druhou stranu pro veřejnost poměrně nová záležitost (z preview verze se překlenulo na začátku roku 2015). Nabízí se tedy několik otázek. Jaký je vlastně rozdíl mezi Data Miningem a Machine Learningem. Není Azure Machine Learning jen nový marketingový název pro starý Data Mining převlečený do Azure? K čemu by tahle technologie mohla být dobrá a bude mi k něčemu i když nejsem datový věděc?
Na začátek definice obou pojmů
Data Mining (DM)
Data Mining je pokročilá statistická analýza dat, která zkoumá historická data za účelem objevení korelací a vazeb mezi daty.
Data Miningová funkčnost je součástí analytických služeb SQL Serveru. Tedy pro tvorbu řešení budete potřebovat SSAS, Visual Studio pro design řešení a Management Studio pro psaní DMX (Data Mining eXtensions)
Machine Learning (ML)
Machine Learning je definován jako technologie, které používá prediktivní modely, které se učí z dat za účelem předvídat budoucí chování, výstupy, trendy. Jiná definice by mohla znít, že se jedná o: “Počítačové systémy, které se stávají chytřejší na základě předchozí zkušenosti.” Kde zkušenost může být brána z historických dat, nebo lidských vstupů.
Rozdílem v definici mezi DM a ML tedy je, že ML se systém může učit z předchozí zkušenosti. Hranice mezi tím, co je DM a ML je ale tenká :)
Kde se ML používá a jaké jsou scénáře použití
·        Prodej a marketing
o   forecasting prodejů
o   forecasting poptávky
o   cílená reklama
·        Finance a risk management
·        Segmentace zákazníků
·        Doporučení zboží
·        Fraud detection (odhalování podvodů)
·        Předpověd počasí
·        Analýza lidské řeči
o   sentiment analýza spokojenosti zákazníků
o   detekece SPAMu
·        a další.
Azure ML klíčové vlastnosti
Azure Machine learning je služba v MS Azure. Oproti SQL Server Data Miningu nebudeme potřebovat SQL Server, stačí nám Azure Subscription a libovolný internetový prohlížeč. Při tvorbě řešení se začíná tvorbou Machine Learning Workspace v Azure Portálu https://manage.windowsazure.com/ Když ML Workspace hotov, můžeme se přihlásit do ML Studia, které najdeme na adrese https://studio.azureml.net Zde se tvoří Experimenty. Experiment můžeme tvořit nad demo daty, nebo daty vlastními. Data můžeme importovat jako csv, textový soubor, načíst z databáze, nebo jiných podporovaných zdrojů. Proces analýzy dat máme možnost ovlivnit od začátku do konce transformacemi, nebo i vlastními skripty (R nebo Python). Experiment se dá vypublikovat jako webová služba a k této můžeme přistupovat z externích aplikací.
Tvorba experimentu
Když klikneme na velké plusko, vyskočí na nás možnost tvořit Experimenty, Datasety, Moduly. Když se podíváme na Experimenty je tu solidní základna ukázek. Najdeme zde například aplikace jako je sentiment analýza tweetů (o sentiment analýze přes PowerBI jsem psal zde http://www.neoral.cz/2015/06/sentiment-analyza-pres-powerbi.html), příklady z analýzy retailu, fraud detection, doporučení restaurací, filmů a mnohé další. Pokud by Vám pro inspiraci nestačily ukázky od Microsoftu, můžete kouknout do galerie na tvorbu komunity https://gallery.azureml.net/ Pro milovníky vína je zde například „Wine quality predictor“ Takže až při dlouhých teplých letních večerech nebudete vědět co dělat, můžete se věnovat Machine Learningu :)
Když zvolíme prázdný experiment, tvorba experimentu připomíná SQL Server Integration Services. Do prázdné plochy experimentu můžeme drag & drop  přetahovat datasety, transformace, moduly a tyto mezi sebou spojovat a konfigurovat.
Na závěr jde vypublikovat experiment jako webovou službu s vstupními a výstupními parametry. Webovou službu poté může volat aplikace a tímto ML využívat.
Experiment “Movie recommender”
Zde stručně textově popisuji proces, který taktéž můžete shlédnout na videu https://youtu.be/5AAxrjbVtCg

Ve vyhledávači můžeme najít zdrojový dataset Movie ratings, který obsahuje 4 sloupce UserID, MovieID, Rating a Timestamp. Už nyní by se dalo jít na transformaci Project Columns, kde vybereme jen relevantní sloupce UserID, MovieID a Rating, které očekává Train Matchbox Recommender. Dalo by se ale dohledat i název filmu z druhého datasetu IMDB Movie Titles přes „Join“. Transformace Split rozdělí dataset na část pro trénování a část pro testování přesnosti, aby se ML mohl učit. Score Matchbox Recomender slouží k samotnému doporučení. Zde se dá zvolit kolik filmů chceme minimálně  a maximálně doporučit.

Závěr
Machine Learning posouvá hranice a hlavně dostupnost analýzy zase o něco dál. Jako největší přednosti Machine Learningu spatřuji. Nenáročnost – jediné co potřebujete pro tvorbu jsou Azure subscription a internetový prohlížeč. Rozšiřitelnost – můžete vystačit s “klikacími” komponentami, ale můžete psát pro analýzy dat vlastní skripty. Svůj výtvor můžete vystavit jako webovou službu a tuto volat z aplikace. Tedy pokud jste datový věděc, umíte psát R skripty a vytvořit řešení , které bude užitečné pro širší spektrum lidí. Vystavte svůj výtvor a vydělejte na něm peníze. Nejste datový věděc? Přesto můžete používat výtvory jiných. To dělá z Machine Learningu technologii pro všechny.
Další zdroje informací

7. července 2015

MDX tutorial 4 – Aplikace MDX v SSRS

V minulých dílech tutorialu jsme si ukázali, jak si napsat svůj vlastní MDX dotaz. Stejně tak jsme si ukázali, jak pracovat s funkcí currentmember a tvořit vlastní počítané členy (článek: http://www.neoral.cz/2015/05/mdx-tutorial-3-pocitane-cleny.html). Aby naše snažení přineslo i nějaké hmatatelné ovoce, ukažme si jak vlastní dotaz dostat do reportu v SSRS (SQL Server Reporting Services). Některé věci je lepší jednou ukázat, než se snažit psát dlouhé popisy. Tvorba reportu je jednou z nich. Celý proces jsem zaznamenal se slovním komentářem a můžete jej sledovat zde https://youtu.be/RFX84weMqA8.

Video není jen o MDX, ale ukazuji i pár tipů a triků pro práci s parametry v Reporting Services. Při nahrávání jsem zapomněl namapovat do hlavního dotazu parametr SUBCATEGORY. Princip je stejný jako u parametru CATEGORY a nedostatek jsem napravil alespoň v textu článku.
Pojďme tedy tvořit report z kostky. Výsledkem našeho snažení bude report analýzy prodejů v čase s parametry Kategorie a Podkategorie produktů.
Co budeme potřebovat? V prvé řadě dataset pro hlavní report. 
Zdrojový select pro hlavní dataset bez parametru vypadá:
SELECT
       {[Measures].[Reseller Sales]
       ,[Measures].[Internet Sales]}
ON COLUMNS,
NON EMPTY
       {[Dim Date].[Year].[Year]}*
       [Dim Date].[Quarter].[Quarter]*
       [Dim Date].[Month].[Month]
ON ROWS
FROM [MDX Tutorial]
Pokud chceme dotaz parametrizovat, narazíme na dva problémy. Zaprvé MDX jazyk nezná nic jako deklaraci proměnných.  Zadruhé Reporting Services budou hodnotu parametru podsouvat do SSAS zdroje jako text. Textovou hodnotu můžeme převést na člena funkcí StrToMember nebo na množinu prvků funkcí StrToSet. Pro parametry většinou použijete funkci StrToSet. Složitější je řešení problému s chybějící deklarací. Pokud se na parametr odvolávám, nejdou mi načíst pole v designeru, takže si chystám dataset tak aby se dal ladit v Management Studiu. Nachystám si něco jako defaultní filter a parametr ve funkci StrToSet dočasně zakomentuji. Hodnoty parametrů se zpravidla píšou do Subselectů kvůli omezení, že jedna hierarchie v MDX může figurovat pouze na jedné ose.
Spustitelný dotaz z SSMS (SQL Server Management Studio) kopíruji do schránky
SELECT
       {[Measures].[Reseller Sales]
       ,[Measures].[Internet Sales]}
ON COLUMNS,
non empty
       {[Dim Date].[Year].[Year]}*
       [Dim Date].[Quarter].[Quarter]*
       [Dim Date].[Month].[Month]
ON ROWS
FROM
(SELECT [Dim Product].[Category].&[Bikes]/*StrToSet(@CATEGORY)*/ ON COLUMNS FROM
[MDX Tutorial]
)
pravé tlačítko na datový zdroj Analysis Services, query designer (přímo psát nejde), přepnutí ikonkou s trojúhelníkem z design módu do textového, náhrada dotazu mým skriptem ve schránce, ok. To by mělo načíst seznam polí na záložce fields. Tlačítko Fx mě dostane do dotazu v textovém režimu, kde můžu umazat komentáře a získat dotaz
SELECT
       {[Measures].[Reseller Sales]
       ,[Measures].[Internet Sales]}
ON COLUMNS,
non empty
       {[Dim Date].[Year].[Year]}*
       [Dim Date].[Quarter].[Quarter]*
       [Dim Date].[Month].[Month]
ON ROWS
FROM
(SELECT StrToSet(@CATEGORY) ON COLUMNS FROM
(SELECT StrToSet(@SUBCATEGORY) ON COLUMNS FROM
[MDX Tutorial]
)
)
Parametry CATEGORY a SUBCATEGORY musím vytvořit manuálně. Zbývá napsat dva datasety, kterými budu parametry plnit.
Syntaxe datasetu plnící jednopoložkový  parametr CATEGORY by mohla vypadat následovně
WITH MEMBER ParameterValue AS
       [Dim Product].[Category].currentmember.uniquename
MEMBER ParameterLabel AS
       [Dim Product].[Category].currentmember.name
SELECT
       {ParameterValue
       ,ParameterLabel}
ON COLUMNS,
nonempty(
       {[Dim Product].[Category].members}
       ,{[Measures].[Reseller Sales],[Measures].[Internet Sales]}
       )
ON ROWS
FROM [MDX Tutorial]

Počítaný člen ParameterValue vrací unikátní identifikaci každého záznamu, ParameterLabel se odkazuje na name column, zde by se dalo použít i MEMBER_CAPTION což je jméno po aplikaci translations pokud v kostce existují. Výraz na řádcích vratí všechny členy atributové hierarchie včetně All membera, ale pouze ty kategorie, které se prodávaly.
Dataset pro parametr SUBCATEGORY je ekvivalentní, jen s odkazem na předchozí parametr.
WITH MEMBER ParameterValue AS
       [Dim Product].[Subcategory].currentmember.uniquename
MEMBER ParameterLabel AS
       [Dim Product].[Subcategory].currentmember.name
SELECT
       {ParameterValue
       ,ParameterLabel}
ON COLUMNS,
nonempty(
       {[Dim Product].[Subcategory].[Subcategory]}
       ,{[Measures].[Reseller Sales],[Measures].[Internet Sales]}
       )
ON ROWS
FROM [MDX Tutorial]
WHERE StrToSet(@CATEGORY)
Hotový report si můžete stáhnout zde
Závěr:

Článek shrnuje tvorbu parametrizovaného Reporting Services reportu vytvořéného nad daty z OLAP kostky, pro nějž jsme si napsali všechny dataset. Všechny kouzla jsou vidět na videu, článek slouží spíš jako doplněk kvůli dohledání „jak ten skript vypadal“