Analysis Services (2008) Fact Table
-
Donnerstag, 11. August 2011 09:02
Hi!
In my relational database is a table with a contract data. The fields are start and end dates. As a result i have to find how many people where on some day (for example, at the end of the month) under contract. I made a view (contract data table und time table) which generates one entry for one day. When one person has a contract for one month, it will be 31 entries. This is then my fact table. There are for sure better possibilities how to solve this.
Any thoughts or help are appreciated.
BR
Daiga
Alle Antworten
-
Donnerstag, 11. August 2011 15:42
Hello Daiga,
Because this is a de-DE forum I am going to answer in German; if this is a problem for you please give a brief reply.
Hast Du die AdventureWorks Beispiel Datenbank & Analysis Service Projekt (Cube)?
Wenn nicht, die gibt es bei CodePlex zum Download (http://msftdbprodsamples.codeplex.com/) für fast alle möglichen SQL Server Versionen.
Dann hätten wir eine einheitliche Datenbasis, anhand deren man Beispiel & Probleme nachvollziehen kann.In dem DW / Cube gibt es die Faktentabelle FactInternetSales mit OrderDate und ShippingDate; das Bestelldatum liegt logischerweise vor dem Lieferdatum und entspricht somit etwa Deinen Vertragsdaten mit Anfang und Ende-Datum.
Zudem gibt es eine Zeitdimension mit möglichen Datumswerten, die im DW angelegt ist.
Die Zeitdimension ist im Cube sowohl mit OrderDate als auch ShippingDate verknüpft.Um nun alle InternetSales innerhalb eines Datumsbereiches von OrderDate und ShippingDate zu ermitteln, kannst Du nachfolgendes MDX Statement verwenden.
SELECT {[Measures].[Internet Sales Amount]} ON 0 ,NON EMPTY {[Date].[Calendar].[Date] * [Ship Date].[Calendar].[Date]} ON 1 FROM [Adventure Works] WHERE ( {[Date].[Date].&[10] : NULL} ,{NULL : [Ship Date].[Date].&[20]} );
In der Y-Achse lasse ich zur Kontrolle die Datumswerte mit ausgeben.
Im Prinzip macht man nur ein Dice auf beide Zeit-Dimension (AND Logik) und gibt bei den Dimensionsattribute nur "[Von Datum] bis null = Ende" und "Null = Anfang bis [Bis Datum]" an, hier also alle Sales, die zwischen dem 10.07 bestellt und 20.07.2001 geliefert wurden.In T-SQL entspräche das
WHERE GueltigVon >= '20010710' and GueltigBis <= '20010720'
Wenn Du nun abfragen möchtest, wieviele Verträge an einem bestimmten Tag gültig waren, gibt's Du für beide Zeit Attribute den gleichen Wert an.Somit brauchst Du die Vertragsdaten nicht für alle Tages des Gültigkeitszeitraumes duplizieren; ein Datensatz mit Gültig Von/Bis reicht aus.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert burkaans Montag, 15. August 2011 08:10
-
Montag, 15. August 2011 08:18
Hallo Olaf,
vielen, vielen Dank für deinen Beitrag, das ist genau die Antwort, die ich gesucht habe!!!
Habe nur en eine falsche Stelle - Design von Cube - gesucht.
Viele Grüße,
Daiga
-
Dienstag, 28. Februar 2012 12:28
Hallo Olaf!
Habe wieder die Zeit mich mit Cubes zu beschäftigen.
Eventuell sollte ich einen neuen Thread starten... So kann man aber gut nachvollziehen, worum es geht.
Die Ermittlung der Anzahl der Verträge an einem Tag oder in einem Zeitraum klappt ganz gut.
Jetzt habe ich wieder Anforderungen an meinem Cube, die ich nicht beantworten kann. Und zwar, geht es um die Anzahl der Tage, die eine Person unter der Vertrag war/ist ausgewertet nach Jahren, Eigentlich um die Personenjahre (die kann ich berechnen, wenn ich die Tage habe) im Jahr 2010, 2011 etc. Habe einiges ausprobiert, komme aber irgendwie nicht weiter...
Wäre sehr dankbar für einen Tipp.
Danke!
Daiga

