IN2BI, Microsoft Business Intelligence
data, stories & insights
rss | email | twitter

To Merge or not To Merge

In het algemeen is het mijn ervaring dat het samenvoegen van 2 afdelingen of bedrijven slecht werkt.  De in het vooruitzicht behaalde synergievoordelen blijken toch niet te realiseren, mensen raken gedemotiveerd en uiteindelijk blijft er een slechter functionerende afdeling/bedrijf over.
Voorzichtig dus hiermee.

Dat geldt ook voor het nieuwe SQL 2008 statement: MERGE.
Deze biedt de mogelijkheid om een INSERT, UPDATE en DELETE in een statement uit te voeren en lijkt daarmee een ideale kandidaat in het ETL proces voor Slowly Changing Dimensions. De Kimball group heeft hierover design tip  #107 geschreven. Deze geeft een goed beeld hoe je MERGE kan gebruiken bij Slowly Changing Dimensions.

Toch lijkt het me verstandiger om juist bij Slowly Changing Dimensions gebruik te maken van de SCD task  in SSIS of deze snellere variant. Dit in verband met exception, error en log handling. De nieuwe MERGE statement is wel uitstekend geschikt voor het vullen van datamarts met (geaggregeerde) informatie. Bijvoorbeeld het vullen van tabel met omzetcijfers per klant voor het gehele jaar waarvoor ik hieronder een simpel voorbeeld heb geschreven.

Dagelijks wordt de tabel JaarVerkopen aangepast met de dagomzetten van gisteren uit de tabel DagVerkopen. Indien het een nieuwe klant betreft dan (NOT MATCHED) volgt een INSERT bij een bestaande klant (MATCHED) wordt het omzetbedrag verhoogd met de omzetten van gisteren.

MERGE JaarVerkopen AS JV
 USING (
 SELECT
             KlantID,
             Omzet = SUM(Omzet),
       FROM DagVerkopen
       WHERE Datum>GETDATE()-1
       GROUP BY KlantID
 ) AS DV
 ON JV.KlantID =DV.KlantID
 
 WHEN NOT MATCHED THEN
       INSERT (KlantID, Omzet)
       VALUES( KlantID, Omzet)
 
WHEN MATCHED THEN
       UPDATE
        SET JV.Omzet = JV.Omzet + DV.OMZET;
 

» Similar Posts

  1. Waarom zijn die omzetbedragen allemaal negatief?
  2. Kilimanjaro
  3. Gouden schoenen en een sportauto

» Trackbacks & Pingbacks

    No trackbacks yet.

» Comments

  1. Ben avatar

    Als ik deze merge uitvoer heb ik morgen

    al de dubbele omzet van vandaag erbij.

    het moet zijn =GETDATE(-1) of ben ik abuis ?

    Ben — juni 4, 2009 12:01
  2. Marco Schreuder avatar

    Het is zeker niet de beste methode om de delta te bepalen. Als je het elke dag op dezelfde tijd (bij voorkeer tijdsframe zonder omzet: nacht) uitvoert moet het echter lukken. Je neemt immers dan elke keer alles groter dan 24 uur geleden.

    Marco Schreuder — juni 4, 2009 1:09

Comments are closed