<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQLBlog Nederland</title>
	<atom:link href="http://www.sqlblog.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sqlblog.nl</link>
	<description>Business Intelligence &#38; Datawarehousing</description>
	<lastBuildDate>Wed, 01 Feb 2012 12:57:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tablix filter met LIKE operator</title>
		<link>http://www.sqlblog.nl/2012/02/tablix-filter-met-like-operator/</link>
		<comments>http://www.sqlblog.nl/2012/02/tablix-filter-met-like-operator/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 12:57:22 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Reporting Services]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/?p=985</guid>
		<description><![CDATA[De LIKE operator in Reporting Services werkt net iets anders dan in SQL. Je verwacht namelijk dat je met een % kunt werken.  Niets is minder waar, erg consistent dus. Als je de LIKE operator wilt gebruiker in bijvoorbeeld de TABLIX ga je naar Tablix properties, Filter: Bij Expression vul je in op welke kolom [...]]]></description>
			<content:encoded><![CDATA[<p>De LIKE operator in Reporting Services werkt net iets anders dan in SQL. Je verwacht namelijk dat je met een % kunt werken.  Niets is minder waar, erg consistent dus.</p>
<p><span id="more-985"></span></p>
<p>Als je de LIKE operator wilt gebruiker in bijvoorbeeld de TABLIX ga je naar Tablix properties, Filter:</p>
<p><a href="http://www.sqlblog.nl/wp-content/uploads/2012/02/filter_1.jpg"><img class="aligncenter size-medium wp-image-986" title="filter_1" src="http://www.sqlblog.nl/wp-content/uploads/2012/02/filter_1-288x300.jpg" alt="" width="288" height="300" /></a>Bij Expression vul je in op welke kolom in je dataset je wilt filteren.  Daarna kies je bij Operator de LIKE. Bij de expressie (klik op het knopje Fx) ga je de volgende expressie invoeren</p>
<p>= &#8220;*&#8221; &amp; &#8220;tekst&#8221; &amp; &#8220;*&#8221;</p>
<p><a href="http://www.sqlblog.nl/wp-content/uploads/2012/02/filter_2.jpg"><img class="aligncenter size-medium wp-image-987" title="Filter LIKE" src="http://www.sqlblog.nl/wp-content/uploads/2012/02/filter_2-300x161.jpg" alt="" width="300" height="161" /></a></p>
<p>Alle records met het woord &#8220;tekst&#8221; worden nu gefilterd.</p>
<p>Alles is zo eenvoudig als je het weet</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2012/02/tablix-filter-met-like-operator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ontvang het boek &#8216;Datavault implementeren met Pentaho integratie&#8217; gratis</title>
		<link>http://www.sqlblog.nl/2011/12/ontvang-het-boek-datavault-implementeren-met-pentaho-integratie-gratis/</link>
		<comments>http://www.sqlblog.nl/2011/12/ontvang-het-boek-datavault-implementeren-met-pentaho-integratie-gratis/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 12:56:50 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Overige]]></category>
		<category><![CDATA[E-Books]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/?p=981</guid>
		<description><![CDATA[Ontvang het boek &#8216;Datavault implementeren met Pentaho integratie&#8217; gratis Dit boek is een zelfstudie voor Pentaho Data Integratie en geeft praktijkervaring in het samenstellen van een datavault architectuur. De opdrachten resulteren in een werkende oplossing die als basis kan worden gebruikt voor een BI oplossing in uw eigen omgeving. Het boek is te koop via: [...]]]></description>
			<content:encoded><![CDATA[<p>Ontvang het boek &#8216;Datavault implementeren met Pentaho integratie&#8217; gratis</p>
<blockquote><p>Dit boek is een zelfstudie voor Pentaho Data Integratie en geeft praktijkervaring in het samenstellen van een datavault architectuur. De opdrachten resulteren in een werkende oplossing die als basis kan worden gebruikt voor een BI oplossing in uw eigen omgeving. Het boek is te koop via: <a href="http://bit.ly/datavaultimplementeren" target="_blank">http://bit.ly/datavaultimplementeren</a> U kunt dit boek gratis ontvangen als hardcopy en als PDF. Vul het onderstaande formulier in en u ontvangt het boek tijdens een persoonlijk gesprek gratis.</p></blockquote>
<p>&nbsp;</p>
<p><a href="https://docs.google.com/a/kraaitje.nl/spreadsheet/viewform?hl=nl&amp;formkey=dHVUOXhGSi1mTkg3cV8zUEFRM0FiTlE6MQ&amp;theme=0AX42CRMsmRFbUy0xOGQxNWI3Yi01NzQzLTQ1ZjUtOTk4OS1kODRlZWIwNjMxZTU&amp;ifq">Klik hier voor de website.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2011/12/ontvang-het-boek-datavault-implementeren-met-pentaho-integratie-gratis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sql Server 2012 Training Kit gratis download</title>
		<link>http://www.sqlblog.nl/2011/12/sql-server-2012-training-kit-gratis-download/</link>
		<comments>http://www.sqlblog.nl/2011/12/sql-server-2012-training-kit-gratis-download/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 10:45:10 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Overige]]></category>
		<category><![CDATA[E-Books]]></category>
		<category><![CDATA[Sql Server 2012]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/?p=976</guid>
		<description><![CDATA[SQL Server 2012 Developer Training Kit Web Installer Preview is nu gratis te downloaden op de Microsoft Website hier. The SQL Server 2012 Developer Training Kit includes technical content including labs, demos and presentations designed to help you learn how to develop SQL Server 2012 database and BI solutions. New and updated content will be [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server 2012 Developer Training Kit Web Installer Preview is nu gratis te downloaden op de Microsoft Website <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=27721">hier</a>.</p>
<blockquote><p>The SQL Server 2012 Developer Training Kit includes technical content including labs, demos and presentations designed to help you learn how to develop SQL Server 2012 database and BI solutions. New and updated content will be released periodically and can be downloaded on-demand using the Web Installer Preview.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2011/12/sql-server-2012-training-kit-gratis-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beste WordPress Twitter/facebook/google rater</title>
		<link>http://www.sqlblog.nl/2011/12/beste-wordpress-twitterfacebookgoogle-rater/</link>
		<comments>http://www.sqlblog.nl/2011/12/beste-wordpress-twitterfacebookgoogle-rater/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 14:24:08 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/?p=968</guid>
		<description><![CDATA[Ik heb een aantal wordpress social plugins getest en vond deze de beste: WordPress Social Ring Deze plugin ondersteunt Google+, Twitter, Facebook Like/Share en ook de layout is prima. Je kunt de plugin bovenaan berichten en onderaan berichten plaatsen. Daarnaast kun je hem ook op de frontpage toevoegen. &#160;]]></description>
			<content:encoded><![CDATA[<p>Ik heb een aantal wordpress social plugins getest en vond deze de beste: <a title="Wordpress Social Ring" href="http://wordpress.org/extend/plugins/wordpress-social-ring/"><strong>WordPress Social Ring</strong></a></p>
<p>Deze plugin ondersteunt Google+, Twitter, Facebook Like/Share en ook de layout is prima. Je kunt de plugin bovenaan berichten en onderaan berichten plaatsen. Daarnaast kun je hem ook op de frontpage toevoegen.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2011/12/beste-wordpress-twitterfacebookgoogle-rater/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog omgezet naar WordPress</title>
		<link>http://www.sqlblog.nl/2011/12/blog-omgezet-naar-wordpresss/</link>
		<comments>http://www.sqlblog.nl/2011/12/blog-omgezet-naar-wordpresss/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 12:01:36 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Overige]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/?p=960</guid>
		<description><![CDATA[SqlBlog draait vanaf op WordPress]]></description>
			<content:encoded><![CDATA[<p>SqlBlog draait vanaf op WordPress</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2011/12/blog-omgezet-naar-wordpresss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running Totals / Cumulatieven berekenen</title>
		<link>http://www.sqlblog.nl/2011/05/running-totals-cumulatieven-berekenen-6/</link>
		<comments>http://www.sqlblog.nl/2011/05/running-totals-cumulatieven-berekenen-6/#comments</comments>
		<pubDate>Tue, 24 May 2011 09:34:03 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/2011/05/running-totals-cumulatieven-berekenen-6/</guid>
		<description><![CDATA[Op internet is er al veel over geschreven maar ik vond het de moeite waard om een artikel te posten over Running Totals / Cumulatieven berekenen binnen Microsoft SQL Server 2005 / 2008. Er zijn diverse manieren om dit te doen. De meest snelle manier wordt in dit artikel besproken. SQL Server 2005 + heeft [...]]]></description>
			<content:encoded><![CDATA[<div><img src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/dbicons/primary_key_zoom_128.gif" alt="primary_key_zoom_128" width="64" height="64" border="0" />Op internet is er al veel over geschreven maar ik vond het de moeite waard om een artikel te posten over Running Totals / Cumulatieven berekenen binnen Microsoft SQL Server 2005 / 2008. Er zijn diverse manieren om dit te doen. De meest snelle manier wordt in dit artikel besproken.</div>
<div><span id="more-904"></span></div>
<div>SQL Server 2005 + heeft zelf geen goede manier om running totals te berekenen. Hij kan namelijk niet uit zichzelf de vorige rij bij de huidige rij optellen. Er moet een manier worden gevonden om de vorige rij bij de huidige rij op te tellen.</div>
<div>De meest gebruikte methode en het eenvoudigste te begrijpen is de self-join. Bij deze methode “Join” je de dataset op zichzelf om iedere keer het resultaat van vorige records op te kunnen tellen. Dit is alleen niet de meest effectieve methode!</div>
<div>De meest snelle methode is door gebruik te maken van een table variable of tijdelijke tabel (@ of #). Laat ik dit uitleggen met een voorbeeld. We gebruiken hiervoor AdventureWorksDW. Stel dat we per klant de internetsales cumulatieven willen uitrekenen over de tijd.</div>
<div>Eerst maken we een table variable (@) aan en vullen deze met alle internetsales per klant per week. We sorteren de data bij het invoegen. Dit is absoluut noodzakelijk omdat we daarna de records een voor een bijwerken met cumulatieven.</div>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">USE</span> AdventureWorksDW
GO
<span style="color: #0000FF;">DECLARE</span> @RunningTotalAantal <span style="color: #0000FF;">INT</span>
<span style="color: #0000FF;">DECLARE</span> @RunningTotalBedrag <span style="color: #0000FF;">MONEY</span>
<span style="color: #0000FF;">DECLARE</span> @KlantNaam <span style="color: #0000FF;">AS</span> <span style="color: #0000FF;">VARCHAR</span><span style="color: #808080;">&#40;</span><span style="color: #000;">128</span><span style="color: #808080;">&#41;</span>
&nbsp;
<span style="color: #0000FF;">DECLARE</span> @Sales <span style="color: #0000FF;">TABLE</span> <span style="color: #808080;">&#40;</span>WeekNaam <span style="color: #0000FF;">VARCHAR</span><span style="color: #808080;">&#40;</span><span style="color: #000;">128</span><span style="color: #808080;">&#41;</span>, KlantNaam <span style="color: #0000FF;">VARCHAR</span><span style="color: #808080;">&#40;</span><span style="color: #000;">128</span><span style="color: #808080;">&#41;</span>, Aantal <span style="color: #0000FF;">INT</span>, Bedrag <span style="color: #0000FF;">MONEY</span>, AantalCumulatief <span style="color: #0000FF;">INT</span>, BedragCumulatief <span style="color: #0000FF;">MONEY</span><span style="color: #808080;">&#41;</span>
&nbsp;
<span style="color: #0000FF;">INSERT</span> <span style="color: #0000FF;">INTO</span> @Sales
SELECTDT.<span style="color: #202020;">CalendarYear</span> <span style="color: #808080;">*</span> <span style="color: #000;">100</span> <span style="color: #808080;">+</span> DT.<span style="color: #202020;">WeekNumberOfYear</span> <span style="color: #0000FF;">AS</span> WeekNaam
, DC.<span style="color: #202020;">FirstName</span> <span style="color: #808080;">+</span> <span style="color: #FF0000;">' '</span> <span style="color: #808080;">+</span> DC.<span style="color: #202020;">LastName</span><span style="color: #808080;">+</span> <span style="color: #FF0000;">' ('</span> <span style="color: #808080;">+</span> <span style="color: #0000FF;">CAST</span><span style="color: #808080;">&#40;</span>DC.<span style="color: #202020;">CustomerKey</span> <span style="color: #0000FF;">AS</span> <span style="color: #0000FF;">VARCHAR</span><span style="color: #808080;">&#40;</span><span style="color: #000;">16</span><span style="color: #808080;">&#41;</span><span style="color: #808080;">&#41;</span> <span style="color: #808080;">+</span> <span style="color: #FF0000;">')'</span> <span style="color: #0000FF;">AS</span> KlantNaam
, <span style="color: #FF00FF;">SUM</span><span style="color: #808080;">&#40;</span>FIS.<span style="color: #202020;">OrderQuantity</span><span style="color: #808080;">&#41;</span> <span style="color: #0000FF;">AS</span> Aantal
, <span style="color: #FF00FF;">SUM</span><span style="color: #808080;">&#40;</span>FIS.<span style="color: #202020;">SalesAmount</span><span style="color: #808080;">&#41;</span> <span style="color: #0000FF;">AS</span> Bedrag
, <span style="color: #000;">0</span>
, <span style="color: #000;">0</span>
<span style="color: #0000FF;">FROM</span> FactInternetSales <span style="color: #0000FF;">AS</span> FIS
<span style="color: #0000FF;">INNER</span> <span style="color: #808080;">JOIN</span> DimProduct <span style="color: #0000FF;">AS</span> DP <span style="color: #0000FF;">ON</span> FIS.<span style="color: #202020;">ProductKey</span> <span style="color: #808080;">=</span> DP.<span style="color: #202020;">ProductKey</span>
<span style="color: #0000FF;">INNER</span> <span style="color: #808080;">JOIN</span> DimCustomer <span style="color: #0000FF;">AS</span> DC <span style="color: #0000FF;">ON</span> FIS.<span style="color: #202020;">CustomerKey</span> <span style="color: #808080;">=</span> DC.<span style="color: #202020;">CustomerKey</span>
<span style="color: #0000FF;">INNER</span> <span style="color: #808080;">JOIN</span> DimTime <span style="color: #0000FF;">AS</span> DT <span style="color: #0000FF;">ON</span> FIS.<span style="color: #202020;">OrderDateKey</span> <span style="color: #808080;">=</span> DT.<span style="color: #202020;">TimeKey</span>
<span style="color: #0000FF;">GROUP</span> <span style="color: #0000FF;">BY</span> DC.<span style="color: #202020;">FirstName</span>,DC.<span style="color: #202020;">LastName</span>, DC.<span style="color: #202020;">CustomerKey</span>
, DT.<span style="color: #202020;">CalendarYear</span>,DT.<span style="color: #202020;">WeekNumberOfYear</span>
<span style="color: #008080;">-- Sorting is very important here!</span>
<span style="color: #0000FF;">ORDER</span> <span style="color: #0000FF;">BY</span> DC.<span style="color: #202020;">FirstName</span>,DC.<span style="color: #202020;">LastName</span>
, DT.<span style="color: #202020;">CalendarYear</span>,DT.<span style="color: #202020;">WeekNumberOfYear</span></pre></div></div>

<div>Zoals in bovenstaand voorbeeld is te zien sommeren we per klant per week de aantallen verkochte artikelen en het orderbedrag. De waarden AantalCumulatief en BedragCumulatief zetten we op 0.</div>
<div>De tijdelijke tabel is nu gevuld met alle internet sales per klant. Vervolgens gaan we de laatste twee kolommen berekenen, hier gaat het om. Dit is een heel grappig truukje en zeer effectief!</div>
<div></div>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">UPDATE</span> @Sales
<span style="color: #0000FF;">SET</span> @RunningTotalAantal <span style="color: #808080;">=</span> AantalCumulatief <span style="color: #808080;">=</span>
<span style="color: #808080;">&#40;</span><span style="color: #0000FF;">CASE</span> <span style="color: #0000FF;">WHEN</span> KlantNaam <span style="color: #808080;">=</span> @KlantNaam <span style="color: #0000FF;">THEN</span> @RunningTotalAantal <span style="color: #808080;">+</span> Aantal
<span style="color: #0000FF;">ELSE</span> AantalEND<span style="color: #808080;">&#41;</span>
,@RunningTotalBedrag <span style="color: #808080;">=</span> BedragCumulatief <span style="color: #808080;">=</span>
<span style="color: #808080;">&#40;</span><span style="color: #0000FF;">CASE</span> <span style="color: #0000FF;">WHEN</span> KlantNaam <span style="color: #808080;">=</span> @KlantNaam <span style="color: #0000FF;">THEN</span> @RunningTotalBedrag <span style="color: #808080;">+</span> Bedrag
<span style="color: #0000FF;">ELSE</span> BedragEND<span style="color: #808080;">&#41;</span>
,@KlantNaam <span style="color: #808080;">=</span> KlantNaam
<span style="color: #0000FF;">FROM</span> @Sales <span style="color: #0000FF;">AS</span> S
<span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">*</span>
<span style="color: #0000FF;">FROM</span> @Sales</pre></div></div>

<div class="MsoNormal"></div>
<div class="MsoNormal"></div>
<div>Wat je hier doet is de variable RunningTotalAantal vullen met AantalCumulatief. Deze is bij het eerste record leeg. Deze “Aantal Cumulatief” wordt vervolgens gevuld met het veld Aantal. Als we het eerste records pakken is klantnaam &lt;&gt; @Klantnaam, deze variable is immers nog niet gevuld. RunningTotalAantal en AantalCumulatief worden nu gevuld met de waarde Aantal. Hetzelfde gebeurt er bij de kolom BedragCumulatief. Nu komt de truuk, @KlantNaam = Klantnaam. De variabele wordt gevuld met de huidige klantnaam. Dit doen we om te bepalen of we bij een nieuwe klant zijn, dan moet er namelijk weer opnieuw worden begonnen met tellen. Je moet even goed naar de SQL kijken om het te begrijpen.</div>
<div><img src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/Running_Totals_Adventureworks.jpg" alt="Running_Totals_Adventureworks" width="690" height="376" /></div>
<div>Deze methode kun je dus toepassen om statistiekkolommen in je Datawarehouse uit te rekenen. Ik had het nodig om aantal gewerkte uren bij klanten uit te rekenen per medewerker. Nu zul je op AdventureWorksDW niet veel performancewinst boeken t.o.v.self joins of cursors maar als je grote tabellen hebt met een paar miljoen rijen zal dit echt snel gaan. Ik heb dit getest op een tabel met 5 miljoen records. Het uitrekenen van de running totals duurde 1 minuut. Het bijwerken van de FactTable duurde ook 1 minuut.</div>
<div>Voor vragen, leave a message <img src='http://www.sqlblog.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </div>
<div>Bijlage: sql query</div>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2011/05/running-totals-cumulatieven-berekenen-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hoe maak ik een Periode Dimensie?</title>
		<link>http://www.sqlblog.nl/2010/11/hoe-maak-ik-een-periode-dimensie-6/</link>
		<comments>http://www.sqlblog.nl/2010/11/hoe-maak-ik-een-periode-dimensie-6/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 12:14:18 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Architectuur]]></category>
		<category><![CDATA[BI en Datawarehousing]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/2010/11/hoe-maak-ik-een-periode-dimensie-6/</guid>
		<description><![CDATA[Deze blog behandelt de periodedimensie. Deze lijkt sterk op de datumdimensie maar zijn functie is toch anders. De kracht van het gebruik van deze tabel wordt beschreven met wat voorbeelden van AdventureWorks. Inleiding Bij stermodellen is het gebruikelijk dat de mate van detaillering, ook wel bekend als “Grain”, binnen een feit/fact is vastgelegd op datum, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/dbicons/key_primary_level_128.gif" alt="key_primary_level_128" border="0" height="64" width="64" />Deze blog  behandelt de periodedimensie. Deze lijkt sterk op de datumdimensie maar zijn  functie is toch anders. De kracht van het gebruik van deze tabel wordt  beschreven met wat voorbeelden van AdventureWorks.</p>
<p><span id="more-903"></span><br />
<!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} @page Section1 	{size:612.0pt 792.0pt; 	margin:72.0pt 90.0pt 72.0pt 90.0pt; 	mso-header-margin:35.4pt; 	mso-footer-margin:35.4pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:1318339897; 	mso-list-type:hybrid; 	mso-list-template-ids:13664310 179476550 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l0:level1 	{mso-level-start-at:0; 	mso-level-number-format:bullet; 	mso-level-text:-; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} @list l1 	{mso-list-id:1782340240; 	mso-list-type:hybrid; 	mso-list-template-ids:497179384 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:36.0pt; 	mso-level-number-position:left; 	text-indent:-18.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --></p>
<p class="MsoNormal"><strong><span lang="NL">Inleiding</span></strong></p>
<p class="MsoNormal"><span lang="NL">Bij stermodellen is het  gebruikelijk dat de mate van detaillering, ook wel bekend als “Grain”, binnen  een feit/fact is vastgelegd op datum, het laagste level binnen de tijd dat  opgeslagen wordt (tijd kan ook nog maar is nu niet relevant). Stel dat een fact  een grain heeft op weekniveau. Je zult dan gaan proberen een koppeling te  krijgen met de datumdimensie. Dit kun je doen door het weeknummer om te zetten  naar een DatumID (</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">SELECT</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;" lang="NL"> 201001 <span style="color: gray;">*</span> 100 <span style="color: gray;">+</span> 01). </span><span lang="NL">Dit werkt veruit het eenvoudigst. Bij het rapporteren van  managementinformatie werkt dit prima voor transactiefeiten die aggregeerbaar  zijn. De som van de omzet van alles bestellingen over de dagen binnen een maand  is immers de omzet van een maand. Maar wat te doen als je feiten moet  rapporteren die je niet makkelijk kunt optellen? Met andere woorden, de totalen  van maand 1 + 2 + 3 zijn niet de totalen van kwartaal 1. Denk hierbij aan  &#8220;Aantal werkende mensen per week&#8221;. Dit is een feit dat niet op te tellen is.  Toch wil je deze informatie in rapportages kunnen tonen op kwartaal, maand,  jaar, week, etc. en bij voorkeur ook nog in een trendrapportage. De oplossing is  een periode dimensie maken in combinatie met een snapshotfeit. Dit artikel geeft  de voordelen, de werking en een AdventureWorks voorbeeld. Als bijlage van dit  artikel zijn de scripts te vinden om een Periode-dimensie te  bouwen.</span></p>
<p class="MsoNormal"><strong><span lang="NL">Opbouw  Periode-dimensie</span></strong></p>
<p class="MsoNormal"><span lang="NL">Een Periode-dimensie bevat voor  iedere periode een record. Ieder periode maakt deel uit van een  periode-grootheid. Een periodegrootheid kan een maand of een week zijn. De  periode-dimensie bevat in mijn geval 102 records voor het jaar 2010. Voor weken  zijn er 52 records, voor jaar een record, voor maand 12 records, etc.</span></p>
<p><img alt="01_Select_From_DimPeriode" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/01_Select_From_DimPeriode.jpg" height="325" width="669" /></p>
<p class="MsoNormal"><span lang="NL">Verder zijn de volgende  kolommen belangrijk:</span></p>
<p class="MsoNormal"><span lang="NL">PeriodeID: unieke  sleutel<br /></span><span lang="NL">Jaar: het jaar waar de periode in  valt <br /></span><span lang="NL">PeriodeNummer: jaar +  periodenummer<br /></span><span lang="NL">BeginDatumID: eerste dag van  de periode<br /></span><span lang="NL">EindDatumID: laatste dag van de  periode<br /></span><span lang="NL">PeriodeGrootheidID: grootheid van  de periode<br /></span><span lang="NL">VorigJaar1PeriodeID, PeriodeID  van de periode een jaar terug<br /></span><span lang="NL">VorigePeriode01PeriodeID: PeriodeID van de vorige  periode<br /></span><span lang="NL">VorigePeriode02PeriodeID:  PeriodeID van twee periodes terug<br /></span><span lang="NL">VorigePeriode03PeriodeID: PeriodeID van drie periodes  terug<br /></span><span lang="NL">VorigePeriode04PeriodeID: PeriodeID  van vier periodes terug<br /></span><span lang="NL">VorigePeriode05PeriodeID: PeriodeID van vijf periodes  terug<br /></span><span lang="NL">VorigePeriode06PeriodeID: PeriodeID  van zes periodes terug</span></p>
<p class="MsoNormal"><span lang="NL">PeriodeNummer is handig om  later het resultaat van een periode-feit aan een ander feit te koppelen die  bijvoorbeeld op week is geaggregeerd omdat PeriodeNummer hetzelfde is als  WeekNummer. De Vorige ID’s zijn uitermate handig om later vergelijkingen te doen  ten opzichte van de vorige periode. Dit kun je uitbreiden met meer velden  (functie bijgesloten) met bijvoorbeeld deze SQL:</span></p>
<p><samp><code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">UPDATE</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"> DimPeriode</span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">SET</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"> </span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span>VorigePeriode01PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>1<span style="color: gray;">)</span></span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span style="color: gray;">,</span> VorigePeriode02PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>2<span style="color: gray;">)</span></span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">,</span> VorigePeriode03PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>3<span style="color: gray;">)</span></span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">,</span> VorigePeriode04PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>4<span style="color: gray;">)</span></span></code> <code class="MsoNormal mceVisualAid mceVisualGuides"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">,</span> VorigePeriode05PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>5<span style="color: gray;">)</span></span></code> </samp><code class="MsoNormal mceVisualAid mceVisualGuides"><samp><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">,</span> VorigePeriode06PeriodeID <span style="color: gray;">=</span> dbo<span style="color: gray;">.</span>GetParallelPeriodID<span style="color: gray;">(</span>PeriodeID<span style="color: gray;">,</span> <span style="color: gray;">-</span>6<span style="color: gray;">)</span></span></samp><span style="font-size: 8pt;" lang="NL"> </span></code> </p>
<p class="MsoNormal"><strong><span lang="NL">Sleutelopbouw</span></strong></p>
<p class="MsoNormal"><span lang="NL">De primaire sleutel van de  tabel is PeriodeID. Deze is uniek. De sleutel is opgebouwd met bepaalde logica:  Jaar + PeriodeGrootheid + PeriodeNummer.</span></p>
<p class="MsoNormal"><span lang="NL"> </span></p>
<p class="MsoNormal"><em><span lang="NL">Voorbeeld Week  12-2010: 2010112 <br /></span></em><em><span lang="NL">Voorbeeld Maand 8-2010: 2010208</span></em><em><span lang="NL"> </span></em></p>
<p class="MsoNormal"><span lang="NL">Voor iedere periodegrootheid en  iedere periode is er een record aanwezig. De periodegrootheden die onderkent  zijn:</span></p>
<ul style="margin-top: 0cm;" type="disc">
<li class="MsoNormal"><span lang="NL">Week</span></li>
<li class="MsoNormal"><span lang="NL">Maand obv.  Kalender</span></li>
<li class="MsoNormal"><span lang="NL">Kwartaal obv.  Kalender</span></li>
<li class="MsoNormal"><span lang="NL">Periode obv. 444  Weekverdeling</span></li>
<li class="MsoNormal"><span lang="NL">Maand obv. 445  Weekverdeling</span></li>
<li class="MsoNormal"><span lang="NL">Kwartaal obv. 445  Weekverdeling</span></li>
<li class="MsoNormal"><span lang="NL">Jaar obv.  Kalender</span></li>
<li class="MsoNormal"><span lang="NL">Jaar obv.  Weekverdeling</span></li>
<li class="MsoNormal"><span lang="NL">Dag</span></li>
</ul>
<p class="MsoNormal"><strong><span lang="NL"> </span></strong></p>
<p class="MsoNormal"><strong><span lang="NL">Gebruiksvoorbeelden</span></strong></p>
<p class="MsoNormal"><span lang="NL">De periode-dimensie kun je  combineren met een organisatiestructuur. Zo krijg je combinatie van alle  periodes en alle organisatie-eenheden. Vervolgens kun je aan deze combinaties  waarden hangen, bijvoorbeeld KPI’s. Het plaatje ziet er ongeveer zo uit:  <br /></span></p>
<p><img alt="PeriodeKubus" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/PeriodeKubus.png" height="317" width="275" /></p>
<p class="MsoNormal"><span style="text-decoration: underline;"><span lang="NL"> </span></span></p>
<p class="MsoNormal"><span style="text-decoration: underline;"><span lang="NL">Business-vraagstukken die je kunt  beantwoorden:</span></span></p>
<ul>
<li><span lang="NL">Aantal medewerkers die bij ons bedrijf werken. De  gebruiker moet met behulp van een parameter kunnen aanpassen hoe hij de data  wilt bekijken. Hij moet dit per week, per maand, per kwartaal en per jaar kunnen  bekijken.</span> Je zult nu de meetwaarde &#8220;aantal medewerkers&#8221; moeten gaan  bepalen op iedere periodegrootheid die men wenst.<span lang="NL">&nbsp;</span></li>
<li>Ranking; hoe verhoud mijn afdeling zicht ten opzichte van andere  afdelingen (omzet kpi delen door aantal fte)</li>
<li>Omzetgegevens afzetten tegen een periode een jaar terug: je hoeft  geen grote tabellen meer door te worstelen en SUM functies te gebruiken, je  slaat de omzetgegevens in alle mogelijke combinaties op in een KPI tabel die  gebruik maakt van DimPeriode</li>
<li>Trendlijnen  laten zien: trendlijnen performen vaak slecht in combinatie met SQL (zonder  OLAP). Verschillende Group By en SUM functies verstoren de performance. Met een  KPI tabel in combinatie met DimPeriode heb je dit probleem  minder.</li>
</ul>
<p><span lang="NL">Voorwaarde voor een juiste  werking van dit mechanisme is dat je redelijk complexe SQL nodig hebt om de  nieuwe feiten te gaan vullen. Dit hoeft niet altijd zo te zijn. <strong> </strong></span><span lang="NL">Om de werking en de kracht van  de tabel te demonstreren geef ik enkele voorbeelden van SQL op  AdventureWorksDWH.</span></p>
<p class="MsoNormal"><span lang="NL"> </span></p>
<p><em><span lang="NL">Vraagstuk:  aantal klanten die een internetsale hebben geplaatst, opgesplitst in weken,  maanden en jaar.</span></em></p>
<p class="MsoNormal"><em><span lang="NL"> </span></em></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: green;" lang="NL">&#8211; Ik doe  er even 6 jaar bij optellen omdat in DimPeriode niet alle  jaren</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: green;" lang="NL">&#8211;  aanwezig zijn.</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">SELECT</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span>DP<span style="color: gray;">.</span>PeriodeID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">,</span><span style="color: fuchsia;">SUM</span><span style="color: gray;">(</span>FIS<span style="color: gray;">.</span>IsOrder<span style="color: gray;">)</span> <span style="color: blue;">AS</span> AantalBestellingen</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">FROM</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">(</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: blue;">SELECT</span> <span style="color: fuchsia;">CONVERT</span><span style="color: gray;">(</span><span style="color: blue;">VARCHAR</span><span style="color: gray;">,</span> DT<span style="color: gray;">.</span>FULLDATEALTERNATEKEY<span style="color: gray;">,</span> 112<span style="color: gray;">)</span> <span style="color: gray;">+</span> 60000 <span style="color: blue;">AS</span> OrderDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">,</span>1 <span style="color: blue;">AS</span> IsOrder</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: blue;">FROM</span><span> </span>FACTINTERNETSALES <span style="color: blue;">AS</span> FIS</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">INNER</span> <span style="color: gray;">JOIN</span> DIMTIME <span style="color: blue;">AS</span> DT <span style="color: blue;">ON</span> FIS<span style="color: gray;">.</span>ORDERDATEKEY <span style="color: gray;">=</span> DT<span style="color: gray;">.</span>TIMEKEY</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: blue;">WHERE</span><span> </span><span style="color: fuchsia;">CONVERT</span><span style="color: gray;">(</span><span style="color: blue;">VARCHAR</span><span style="color: gray;">,</span> DT<span style="color: gray;">.</span>FULLDATEALTERNATEKEY<span style="color: gray;">,</span> 112<span style="color: gray;">)</span> <span style="color: gray;">&gt;</span> 20040000</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;" lang="NL">)</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"> <span style="color: blue;">AS</span> FIS <span style="color: green;">&#8211;Hier is de truuk, bepaal in  welke periodes een bestelling valt!</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;">INNER</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: gray;">JOIN</span> DimPeriode <span style="color: blue;">AS</span> DP <span style="color: blue;">ON</span> FIS<span style="color: gray;">.</span>OrderDatumID <span style="color: gray;">BETWEEN</span> DP<span style="color: gray;">.</span>BeginDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">AND</span><span> </span>DP<span style="color: gray;">.</span>EindDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">INNER</span> <span style="color: gray;">JOIN</span> DimPeriodeGrootheid <span style="color: blue;">AS</span> DPG <span style="color: blue;">ON</span> DP<span style="color: gray;">.</span>PeriodeGrootheidID <span style="color: gray;">=</span> DPG<span style="color: gray;">.</span>PeriodeGrootheidID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">GROUP</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">BY</span> DP<span style="color: gray;">.</span>PeriodeID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">ORDER</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">BY</span> PeriodeID</span></p>
<p><img alt="03_AdventureWorks_Orders_Per_Period" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/03_AdventureWorks_Orders_Per_Period.jpg" height="229" width="562" /></p>
<p class="MsoNormal"><span lang="NL"> </span></p>
<p class="MsoNormal"><span lang="NL">Wat je in de afbeeldingen ziet  zijn alle periodes in 2010 met het aantal klanten die een internetsale hebben  geplaatst. Zo heb ik er twee uitgepikt om toe te lichten hoe het  werkt.</span></p>
<p class="MsoNormal"><span lang="NL">De uitkomst van deze SQL kun je  in een nieuwe tabel stoppen, bijvoorbeeld FactPeriodeKPI. Een Measure binnen  FactPeriodeKPI wordt dan AantalInternetBestellingen. Op deze manier kun je  diverse KPI’s / Measures opslaan.</span></p>
<p class="MsoNormal"><span lang="NL"><em>Vraagstuk: aantal unieke  klanten per sales territory, afgezet over de tijd</em></span></p>
<p class="MsoNormal"><span lang="NL">Dit is een leuke een. Dit is  een typische KPI die niet aggregeerbaar is. Het aantal klanten binnen een week  kun je niet optellen om ze op maand te zien. Je moet deze waarden dus per  periode uitrekenen. De truuk is om te kijken welke klanten een bestelling hebben  per datum. Als een klant op een dag twee bestellingen heeft is dit niet relevant  voor de telling, het gaat immers om het aantal unieke klanten per dag. <strong><span style="text-decoration: underline;">Vervolgens ga je dit koppelen aan de  periodes door te bepalen of een datum in een periode valt</span></strong>. Daar  overheen doe je een COUNT DISTINCT om het aantal unieke klanten te bepalen. Het  wordt helemaal een feest als een klantstructuur ook hierarchieen bevat. Een  klant is alleen een klant op het hoogste niveau (bijv concern), alle  onderliggende nummers moeten niet als uniek worden geteld. Dit laat ik even  buiten de scope. Op naar de SQL:</span></p>
<p class="MsoNormal"><span lang="NL"> </span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">SELECT</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span>DP<span style="color: gray;">.</span>PeriodeID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span> </span><span style="color: gray;">,</span>DPG<span style="color: gray;">.</span>Naam</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span> </span><span style="color: gray;">,</span>DP<span style="color: gray;">.</span>PeriodeNummer</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;">,</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: fuchsia;">COUNT</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;">(</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">DISTINCT</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> FIS<span style="color: gray;">.</span>CUSTOMERKEY<span style="color: gray;">)</span> <span style="color: blue;">AS</span> AantalUniekeKlanten</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;" lang="NL">FROM</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: gray;">(</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span><span style="color: green;">&#8211; Aantal Unieke klanten per  orderdatum</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">SELECT</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">DISTINCT</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: fuchsia;">CONVERT</span><span style="color: gray;">(</span><span style="color: blue;">VARCHAR</span><span style="color: gray;">,</span> DT<span style="color: gray;">.</span>FULLDATEALTERNATEKEY<span style="color: gray;">,</span> 112<span style="color: gray;">)</span> <span style="color: gray;">+</span> 60000 <span style="color: blue;">AS</span> OrderDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">,</span>DC<span style="color: gray;">.</span>CUSTOMERKEY</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: blue;">FROM</span><span> </span>FACTINTERNETSALES <span style="color: blue;">AS</span> FIS</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span> </span><span style="color: gray;">INNER</span> <span style="color: gray;">JOIN</span> DIMTIME <span style="color: blue;">AS</span> DT <span style="color: blue;">ON</span> FIS<span style="color: gray;">.</span>ORDERDATEKEY <span style="color: gray;">=</span> DT<span style="color: gray;">.</span>TIMEKEY</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">INNER</span> <span style="color: gray;">JOIN</span> DIMCUSTOMER <span style="color: blue;">AS</span> DC <span style="color: blue;">ON</span> FIS<span style="color: gray;">.</span>CUSTOMERKEY <span style="color: gray;">=</span> DC<span style="color: gray;">.</span>CUSTOMERKEY</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: blue;">WHERE</span><span> </span><span style="color: fuchsia;">CONVERT</span><span style="color: gray;">(</span><span style="color: blue;">VARCHAR</span><span style="color: gray;">,</span> DT<span style="color: gray;">.</span>FULLDATEALTERNATEKEY<span style="color: gray;">,</span> 112<span style="color: gray;">)</span> <span style="color: gray;">&gt;</span> 20040000</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;" lang="NL">)</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"> <span style="color: blue;">AS</span> FIS <span style="color: green;">&#8211;Hier is de truuk, bepaal in  welke periodes een bestelling valt!</span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="NL"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: gray;">INNER</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: gray;">JOIN</span> DimPeriode <span style="color: blue;">AS</span> DP <span style="color: blue;">ON</span> FIS<span style="color: gray;">.</span>OrderDatumID <span style="color: gray;">BETWEEN</span> DP<span style="color: gray;">.</span>BeginDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">AND</span><span> </span>DP<span style="color: gray;">.</span>EindDatumID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span><span style="color: gray;">INNER</span> <span style="color: gray;">JOIN</span> DimPeriodeGrootheid <span style="color: blue;">AS</span> DPG <span style="color: blue;">ON</span> DP<span style="color: gray;">.</span>PeriodeGrootheidID <span style="color: gray;">=</span> DPG<span style="color: gray;">.</span>PeriodeGrootheidID</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">GROUP</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">BY</span> DP<span style="color: gray;">.</span>PeriodeID<span style="color: gray;">,</span>DP<span style="color: gray;">.</span>PeriodeNummer<span style="color: gray;">,</span> DPG<span style="color: gray;">.</span>Naam</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;; color: blue;">ORDER</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">BY</span> PeriodeID</span></p>
<p><img alt="04_AdventureWorks_Customers_Per_Period" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/04_AdventureWorks_Customers_Per_Period.jpg" height="140" width="481" /></p>
<p class="MsoNormal"><span lang="NL"> </span></p>
<p class="MsoNormal"><span lang="NL">Bovenstaand  resultaat laat de kracht van DimPeriode zien. Zoals je ziet zijn er in de eerste  drie maanden een aantal unieke klanten. Daaronder zie je het kwartaalresultaat.  Het kwartaalresultaat zijn het aantal unieke klanten in het eerste kwartaal. Dit  is geen som van de eerste drie waarden want dan zou je op 5392 klanten  uitkomen.</span></p>
<p class="MsoNormal"><span lang="NL">De laatste die ik behandel is  het aantal verloren klanten T.O.V. Periode -1, -2, -4, -4. Dit doe ik binnenkort  in dit artikel als ik meer tijd heb.</span></p>
<p class="MsoNormal"><span lang="NL">{attachments}<br /></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2010/11/hoe-maak-ik-een-periode-dimensie-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Vault AdventureWorks Voorbeeld</title>
		<link>http://www.sqlblog.nl/2010/10/data-vault-adventureworks-voorbeeld-6/</link>
		<comments>http://www.sqlblog.nl/2010/10/data-vault-adventureworks-voorbeeld-6/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 13:40:14 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Architectuur]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/2010/10/data-vault-adventureworks-voorbeeld-6/</guid>
		<description><![CDATA[Op internet lees je veel over Data Vault. Wat mij opvalt is dat er (nog) geen goede voorbeelden te vinden zijn van het Datamodel en de ETL. In dit artikel tracht ik door middel van een kleine Data Vault gebaseerd op AdventureWorks 2005 duidelijk te maken hoe een Data Vault qua structuur is opgebouwd en [...]]]></description>
			<content:encoded><![CDATA[<p><img width="64" height="64" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/webdesignicons/plan_ab_help_128.gif" alt="plan_ab_help_128" />Op internet lees je veel over Data Vault. Wat mij opvalt is dat er (nog) geen goede voorbeelden te vinden zijn van het Datamodel en de ETL. In dit artikel tracht ik door middel van een kleine Data Vault gebaseerd op AdventureWorks 2005 duidelijk te maken hoe een Data Vault qua structuur is opgebouwd en hoe de ETL eruit ziet om de Data Vault te vullen. Dit voorbeeld gebruikt niet alle tabellen uit AdventureWorks maar enkel een paar tabellen uit het schema &ldquo;Production&rdquo; .</p>
<p>&nbsp;</p>
<p><span id="more-942"></span></p>
<p>Voor het genereren van de DDL (tabellen) en ETL (laadprocessen) heb ik gebruik gemaakt van de (open-source) tool <a href="http://www.datawarehousemanagement.org/" target="_blank">Quipu </a>welke sinds 1 juli gratis te downloaden is. Deze tool neemt veel werk uit handen door de zaken die normaal veel tijd kosten te automatiseren. Quipu genereert het datamodel voor je (data vault) en de sql om te laden (ETL). Ook kun je views laten genereren die de inhoud van de Data Vault laten zien op een bepaald moment. Het mooie van Data Vault is dat alle ETL stappen uit substappen bestaan die allemaal los zijn op te starten. Quipu genereert alle SQL-statements voor je. Deze SQL wordt opgeslagen in de database van Quipu. Standaard slaat Quipu alles op in zijn Jetty Database. Je kunt dit veranderen zodat hij het in SQL Server opslaat. Dit heb ik zelf ook gedaan zodat ik in de tabellen kon kijken wat er gebeurde. Dit kun je voor elkaar krijgen door een lokale systeemvariabele aan te maken en deze te laten verwijzen naar een properties bestand op de schijf. In deze file staat een verwijzing naar de SQL database (zie documentatie). Zodra de ETL is gegenereerd moet je zelf creatief zijn om hier iets van te bakken. De ETL zijn eigenlijk gewoon SQL-statements die data verplaatsen. Je kunt hier een stored procedure van maken of een SSIS (SQL Server Integration Services) package. Het genereren van deze zaken zit (nog) niet in de versie die ik getest heb (1.03). Alles wat Quipu genereert is volgens de Datavault standaard in ANSI92 SQL. Dit werkt ook onder Sql Server 2005+.</p>
<p>&nbsp;</p>
<p>Alle DDL en ETL kun je downloaden onderaan dit artikel.</p>
<p><strong>Staging Area Adventureworks</strong><br />
Alvorens het Data Vault model geladen wordt dient de data in een Staging Area aanwezig te zijn. Bovenstaande tool genereert staging area tabellen voor je en ook de ETL, dit scheelt weer een berg werk. Nadat ik het schema van AdventureWorks heb geselecteerd stel ik wat opties in:</p>
<p><img width="730" height="260" alt="Data Vault Staging Area Options" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/artikelen/architectuur/data_vault_adventureworks/01_data_vault_staging_generation_options.jpg" /></p>
<p>Ik heb ingesteld dat ik de staging area tabellen wil leeggooien voordat de data wordt geladen en dat ik een full load wil. De eerste zorgt voor extra truncate commando&rsquo;s tussen de laadstatements in. De tweede laadt altijd alle records vanuit de bron. Als Delta Load wordt aangevinkt worden alleen wijzigingen in de bron geladen. Vervolgens kan ik de staging area DDL genereren. Maak eerst een database aan, bijvoorbeeld &ldquo;Adventureworks_stg&rdquo;. Let op de collation (de collation moet hetzelfde zijn als de brondatabase van Adventureworks).</p>
<p>Voer nu dit script uit: 1.0_Create_Staging_Area.sql</p>
<p>Let op: maak eerst de user defined datatypen en schema&rsquo;s aan, deze zitten ook standaard in Adventureworks. Als je deze niet aanmaakt krijg je foutmeldingen.</p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><br />
<meta content="Word.Document" name="ProgId"><br />
<meta content="Microsoft Word 11" name="Generator"><br />
<meta content="Microsoft Word 11" name="Originator"></p>
<link href="file:///C:DOCUME~1 0007892LOCALS~1Tempmsohtml1 1clip_filelist.xml" rel="File-List" />
<style type="text/css"><!--
&lt;! 
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 &gt;
--></style>
<p> </meta><br />
</meta><br />
</meta><br />
</meta>
</p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 255);">CREATE</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"> <span style="color: rgb(0, 0, 255);">TYPE</span> [dbo]<span style="color: rgb(128, 128, 128);">.</span>[NAME] <span style="color: rgb(0, 0, 255);">FROM</span> [nvarchar]<span style="color: rgb(128, 128, 128);">(</span>50<span style="color: rgb(128, 128, 128);">)</span> <span style="color: rgb(128, 128, 128);">NULL<br />
</span></span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 255);">CREATE</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"> <span style="color: rgb(0, 0, 255);">TYPE</span> [dbo]<span style="color: rgb(128, 128, 128);">.</span>[FLAG] <span style="color: rgb(0, 0, 255);">FROM</span> [bit] <span style="color: rgb(128, 128, 128);">NOT</span> <span style="color: rgb(128, 128, 128);">NULL<br />
</span></span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 255);">CREATE</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"> <span style="color: rgb(0, 0, 255);">SCHEMA</span> Production</span></p>
<p class="MsoNormal"><img width="299" height="83" alt="02_data_vault_generate_staging" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/artikelen/architectuur/data_vault_adventureworks/02_data_vault_generate_staging.jpg" /></p>
<p>&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Vervolgens genereren we de ETL om de Staging Area op te vullen.</p>
<p class="MsoNormal">Voer dit script uit: 2.0_Populate_Staging_Area.sql<br />
<a href="images/stories/artikelen/architectuur/data_vault_adventureworks/2.0_Populate_Staging_Area.sql"><br />
</a></p>
<p>Voer de scripts om de beurt uit. Als het goed is worden er tabellen aangemaakt in AdventureWorks_stg en daarna gevuld met het ETL script. We hebben nu een staging area en ETL.</p>
<p class="MsoNormal"><strong>Data Vault AdventureWorks</strong><br />
We willen nu een datamodel genereren en laadprocessen om een Data Vault te laden. Ik ga niet teveel in op de stappen die ik heb doorlopen om tot het model te komen. Ik heb het model laten genereren door bovengenoemde tool. De meeste settings heb ik standaard gelaten. Het voordeel van AdventureWorks is dat het een vrij &ldquo;mooie bron&rdquo; is. Relaties zijn aanwezig, tabelnamen zijn duidelijk. Normaal is dit natuurlijk niet zo. Daarnaast heb ik wat naming conventions mbt tabelnamen. De sleutels heten bijna altijd hetzelfde als de tabel met een suffix.</p>
<p>Hub: NaamTabel_h<br />
Link: TableA_TableB_l&nbsp; &lt;- volgorde van naamgeving belangrijk, zo wordt de naam van de link tussen productmodel en product: Product_ProductModel_l<br />
Satelite op hub: NaamTabel_s<br />
Satelite op link: NaamTabel_l_s<br />
Surrogatkey hub:Hubnaam_hid<br />
Surrogatkey link: Linknaam_lid</p>
<p>Ik heb gemerkt dat dit prettig leest. Je mag volgens de theorie ook de suffix als prefix toevoegen, alleen vind ik dit beter werken. Hieronder zie je een screenshot van mijn instellingen op het schema &ldquo;Production&rdquo;. Zoals je ziet gebruik ik maar een paar tabellen in dit voorbeeld.</p>
<p class="MsoNormal"><img width="356" height="564" alt="03_data_vault_staging_schema" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/artikelen/architectuur/data_vault_adventureworks/03_data_vault_staging_schema.jpg" /></p>
<p class="MsoNormal">Vervolgens laat ik de tool het Data Vault model aanmaken. Als target schema stel ik in &ldquo;dbo&rdquo;. Zo worden alle tabellen netjes dbo.tabelnaam genoemd. Daarna rename ik de tabellen en veldnamen naar de standaarden die hierboven staan voor betere leesbaarheid.</p>
<p>Notitie:<br />
De link tussen product en Bill of Materials komt twee keer voor:<br />
BillOfMaterials_Product_Component_l<br />
BillOfMaterials_Product_ProductAssembly_l</p>
<p>Dit zijn twee aparte links. In het bronmodel zie je ook dat dit twee relaties zijn. Ik weet niet precies hoe Data Vault naming convention toepast bij links tussen dezelfde tabellen maar met een nadere rol.</p>
<p>In Quipu ziet mijn model er nu zo uit:</p>
<p class="MsoNormal"><img width="384" height="355" alt="04_data_vault_AdventureWorks_model" src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/artikelen/architectuur/data_vault_adventureworks/04_data_vault_AdventureWorks_model.jpg" /></p>
<p class="MsoNormal">Voer nu dit script uit: 3.0_Create_Data_Vault_Data_Model.sql</p>
<p class="MsoNormal">
<p>Maak vervolgens de datatypen weer aan die ook in AdventureWorks worden gebruikt.</p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;">CREATE</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">TYPE</span> [dbo]<span style="color: gray;">.</span>[NAME] <span style="color: blue;">FROM</span> [nvarchar]<span style="color: gray;">(</span>50<span style="color: gray;">)</span> <span style="color: gray;">NULL<br />
</span></span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;">CREATE</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"> <span style="color: blue;">TYPE</span> [dbo]<span style="color: gray;">.</span>[FLAG] <span style="color: blue;">FROM</span> [bit] <span style="color: gray;">NOT</span> <span style="color: gray;">NULL<o:p></o:p></span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Voer&nbsp;nu dit script uit: 4.0_Populate_Data_Vault_Model_Script.sql</p>
<p class="MsoNormal">Let op, ik gebruik geen constraints in de Data Vault.</p>
<p class="MsoNormal">Tot slot kun je met Quipu nog wat views aanmaken die de stand van de Data Vault weergeven. Dit zijn de actuele views, laatste stand en point in time. Deze vind je ook bij de scripts:</p>
<p class="MsoNormal">5.0_Views_Last.sql<br />
6.0_Views_Actual.sql<br />
7.0_Views_Point_In_Time.sql</p>
<p class="MsoNormal">
Dat was een voorbeeld van het maken van een kleine Data Vault op AdventureWorks Database van Microsoft. Ik hoop dat dit voorbeeld duidelijk maakt hoe een Data Vault is opgebouwd qua structuur en hoe de laadprocessen eruit kunnen zien. Als je een opmerking of vraag hebt, post een bericht <img src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/automatic/2765/13596412d5233db78844aad237160cd3.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2010/10/data-vault-adventureworks-voorbeeld-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One Single Version of the Truth bestaat niet</title>
		<link>http://www.sqlblog.nl/2010/10/one-single-version-of-the-truth-bestaat-niet-6/</link>
		<comments>http://www.sqlblog.nl/2010/10/one-single-version-of-the-truth-bestaat-niet-6/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 07:38:53 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Architectuur]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/2010/10/one-single-version-of-the-truth-bestaat-niet-6/</guid>
		<description><![CDATA[Ik ben deze week naar een seminar geweest bij Logica genaamd Guru4Pro. Het onderwerp was: “Best Practices in Data Vault” waarbij de Godfather van Data Vault, Dan Linstedt, een van de sprekers was. Daarnaast waren er nog twee andere sprekers aanwezig die ieder een praktijkvoorbeeld uitlegde van een Data Vault implementatie. Dit waren Aytekin Keskin [...]]]></description>
			<content:encoded><![CDATA[<p>Ik ben deze week naar een seminar geweest bij Logica genaamd Guru4Pro. Het onderwerp was: “Best Practices in Data Vault” waarbij de Godfather van Data Vault, Dan Linstedt, een van de sprekers was.<br />
<span id="more-941"></span>Daarnaast waren er nog twee andere sprekers aanwezig die ieder een praktijkvoorbeeld uitlegde van een Data Vault implementatie. Dit waren Aytekin Keskin die aan een Data Vault project bij Tele2 heeft meegewerkt als architect en Liesbeth Hozee die bij Vektis heeft geholpen met een Data Vault project.</p>
<p>Na de introductie werd er veel nadruk gelegd op diverse uitdagingen die men in de projecten tegenkwam. Opvallend was dat dit voornamelijk technische zaken waren. Bijvoorbeeld bij Vektis het onderkennen van goede bronsleutels wanneer er patiëntgegevens door verschillende partijen worden aangeleverd (hoe herken ik dan een unieke patiënt?). Bij Tele2 lag de uitdaging in het enorm aantal requirements, ruim 3000, en deze vertalen in een beknopt aantal functiegebieden.</p>
<p>Het leuke van dergelijke lezingen vind ik altijd dat het jezelf aan het denken zet. Zo kwam Dan Linstedt op een gegeven moment met de uitspraak “A single version of the truth doesn’t exist”. Maar wat doen wij dan alle jaren met onze Datawarehouses? Precies, het creëren van de waarheid. Maar wat is dan de waarheid, wie bepaald wat de waarheid is? Dan gaf een leuk voorbeeld dat ook goed blijft hangen. Hij had het over een lamp met een gele bol erin. Als er iemand anders een blauwe bol indraait krijg je een ander kleur licht. Vervolgens komt er weer iemand anders die er een groene bol indraait. De bol was dan de waarheid en het verwisselen van de bol waren de business rules. Wat hij hiermee probeerde te zeggen was dat de business bepaalt wat de waarheid is. Zodra de business verandert of zodra er nieuwe managers worden aangesteld die gebaat zijn bij een andere waarheid dan zal deze veranderen. Een waarheid binnen een datawarehouse zijn regels op een bepaald moment voor een bepaald persoon.</p>
<p>Data Vault speelt hier goed op in door ruwe data vast te houden. De data zoals het wordt opgeslagen in de diverse bronsystemen. De waarheid is zoals hij in de systemen was opgeslagen zonder dat er data wordt veranderd. Met veranderen bedoel ik opschonen en transformeren. Hierdoor is de data altijd 100% auditable/traceable. Daarbij was nog de vraag of je bijvoorbeeld een datumveld dat als tekst is opgeslagen mag omzetten naar een datumveld, het antwoord werd in het midden gelaten.</p>
<p>Om data vervolgens naar de waarheid “Version of the truth” om te zetten zegt Dan gebruik te maken van Business Vaults in het ruimste begrip des woords. Dit hoeft niet perse een fysieke datamart te zijn zoals een Kimball model, een olap kubus of een datavault met geschoonde data. Business Vault is een heel ruim begrip. Het omvat eigenlijk alles wat op de datavault is gebouwd en wat de data omzet in betekenisvolle businessdata. Dit kan ook een Excelsheet zijn met business rules (met bijvoorbeeld powerpivot) maar ook een fysieke database, gemodelleerd volgens de kimball methodiek.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2010/10/one-single-version-of-the-truth-bestaat-niet-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSRS Best Practice II &#8211; Gebruik Stored Procedures</title>
		<link>http://www.sqlblog.nl/2010/08/ssrs-best-practice-ii-gebruik-stored-procedures-6/</link>
		<comments>http://www.sqlblog.nl/2010/08/ssrs-best-practice-ii-gebruik-stored-procedures-6/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 11:56:23 +0000</pubDate>
		<dc:creator>Ronald Kraijesteijn</dc:creator>
				<category><![CDATA[Reporting Services]]></category>

		<guid isPermaLink="false">http://www.sqlblog.nl/2010/08/ssrs-best-practice-ii-gebruik-stored-procedures-6/</guid>
		<description><![CDATA[  Na wat research op internet wat een betere source is voor een Reporting Services Rapport zijn hieronder de voordelen beschreven voor het gebruik van Stored Procedures . - De query wordt apart opgeslagen buiten SSRS. Het is nu mogelijk om de query aan te passen zonder SSRS te openen. Logica blijft in de database. [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p><img src="http://www.sqlblog.nl/wp-content/themes/twentyten/images/stories/accountingicons/moneybag_open_back_128.gif" width="64" height="64" />Na wat research op internet wat een betere source is voor een Reporting Services Rapport zijn hieronder de voordelen beschreven voor het gebruik van Stored Procedures .</p>
<p>
<br /><span id="more-876"></span>
</p>
<hr />
- De query wordt apart opgeslagen buiten SSRS. Het is nu mogelijk om de query aan te passen zonder SSRS te openen. Logica blijft in de database. Bij veranderen kan er nu ook sneller worden geanlyseerd welke impact wijzigingen hebben op bijvoorbeeld kolommen (kolomnamen staan immers in de stored procedure).<br />- Executieplannen die SQL Server bijhoudt worden bewaard bij het gebruik van stored procedures, bij T-SQL statement die vanuit een SSRS-rapport worden afgevuurd is dit niet het geval<br />- Bepaalde zaken kunnen niet in een T-SQL query in SSRS zoals het gebruik van temp-tables, tabel variabelen en indexeren van temp tables<br />- Stored procedures vormen een abstracte laag tussen de rapporten en de business logica<br />- Stored procedures maken het hergebruik van logica mogelijk.</p>
<p>Kortom, gebruik Stored Procedures als bron voor je rapport. Leer jezelf aan bepaalde naming conventions te gebruiken voor deze procedures, bijvoorbeeld spcRptRapportOverVerzuim. Wanneer het aantal rapporten groeit en het aantal procedures staan deze dingen netjes onder elkaar op categorie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sqlblog.nl/2010/08/ssrs-best-practice-ii-gebruik-stored-procedures-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.sqlblog.nl @ 2012-02-23 01:30:53 -->
