WinFuture-Forum.de: Mdx Summe Der Werte Bis Heute - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Mdx Summe Der Werte Bis Heute SSAS SQL Server Analysis Services


#1 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.448
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 08. Juni 2009 - 14:41

Hi,

ich versuche hier etwas mit MDX zum laufen zu bekommen, oder eher gesagt mit berechneten Elementen. Dabei wird der SQL Server 2005 Standard Edition benutzt.
Mein Arbeitscube umfasst momentan 14 Dimensionen, das ist jedoch für diesen Sachverhalt nicht besonders wichtig, da das aktuelle Measure nur 2 Dimesionen berührt.

Dimension 1 - Datum (Jahr, Monat, Tag)
Dimension 2- Kontonummer

Measure (Soll, Haben)

Faktentabelle( Kontonummer, soll, haben, datum ...)

In der zugrundeliegenden Faktentabelle sind alle Buchungen der Aktivseite einer Bilanz seit 2001 abgespeichert. Um den aktuellen Saldo zu errechnen ist es nötig die Summe des Solls mit der Summe des Habens zu substrahieren.

Also einfach gesagt Sum(Soll)-Sum(Haben).

Das Problem ist jetzt für mich das in den einzelnen Rückgabewerten im Cube immer nur die aktuellen Buchungen berücksichtigt werden.
Wenn ich also für 04.2009 eine Abfrage mache dann erhalte ich einen falschen Saldo, weil nur die Buchungen mit eingerechnet werden die im April stattfanden. Das ist aber inhaltlich falsch.

Ich bräuchte die Summe aller Buchungen bis einschliesslich April. Jedoch weiß ich nicht wie ich dies in MDX anstelle.

Wenn ich folgende Abfrage mache (04.2009 Konto 1851), dann kommt ein falscher Wert heraus, weil die vorhergehenden Buchungssätze nicht mit drin sind.

SELECT
(
	[Measures].[Haben - FACT BILANZKONTEN],
	[DIM DATUM].[JAHR].&[2009],
	[DIM DATUM].[MONAT].&[4],
	[DIM BILANZKONTEN].[DIM BILANZKONTEN].&[1851]
) on 0
from [cube]


Und wenn ich

SELECT
(
	[Measures].[Haben - FACT BILANZKONTEN],
	[DIM DATUM].[JAHR].[ALL]
	[DIM BILANZKONTEN].[DIM BILANZKONTEN].&[1851]
) on 0
from [cube]


abfrage, dann erhalte ich alle jemals getätigten Habenbuchungen, jedoch fehlt die Einschränkung auf den April (also bis wann ich diese Summe haben möchte).

In der Auswertung möchte ich dann anschliessend wie in einer Exceltabelle die 12 Monate des Jahres haben und den Verlauf der Bilanzsalden.


mit ganz normalem SQL würde es so aussehen
SELECT Sum(Soll)-Sum(Haben) From Faktentabelle Where Belegdatum<01.05.2009


bzw. wenn ich nur die Habensumme möchte

SELECT Sum(Haben) From Faktentabelle Where Belegdatum<01.05.2009


Ich stell mich nur zu blöd an dieses einfache Statement in MDX abzubilden, es muss doch gehen.
Für feste Werte bekomme ich es schon hin, ich möchte es aber dynamisch. D.h. ich kann den Cube ja über bestimmte Zeiträume betrachten und für diese möchte ich die Bilanzsumme.

Gruß

tavoc

Dieser Beitrag wurde von tavoc bearbeitet: 08. Juni 2009 - 14:55

your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

Anzeige



#2 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.448
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 09. Juni 2009 - 13:20

Das Problem hat sich halb geklärt.

Ich habe in der Datenbank ein Statement ausgeführt und dadurch eine weitere FACT Tabelle, in dieser ist der Soll/Habenwert kumuliert.

Leider hab ich hier nur die Standardedition, sodass ich nicht "LastNonEmpty" benutzen kann. Jetzt versuche ich die FUnktion nachzubauen, klappt jedoch nur nicht so ganz:

/*Saldo*/
/*Saldo = Soll- Haben
Wenn dieses leer ist, dann Vormonat wählen, ansonsten ausrechnen*/

CASE WHEN NOT IsEmpty([Measures].[SOLL KUM]-[Measures].[HABEN KUM])
		  THEN [Measures].[SOLL KUM]-[Measures].[HABEN KUM]
		  ELSE (
				[DIM DATUM].[Monat].PrevMember
				)
	 END


Dieses füllt im Cube die Werte aus, bei denen keine Buchungen vorliegen.
Jedoch klappt es nicht wenn der Januar leer ist, da dann der Wert vom Vorjahr dezember genutzt werden müsste.

Aktuelles Bild ohne FUnktion.
Die Werte stellen die kumulierten Salden dar, immer wo kein Wert steht gibt es keine Buchung. Das bedeutet das es dazu keinen EIntrag in der Faktentabelle gibt. Theoretisch muss da der Wert des Vorgängermonats hin (rekursiv bis ein Wert gefunden wird)

Jahr/Monat
_____________|1__|2__|3__|4__|5__|6__|7__|8__| 9__|10__|11__|12
2007_________|10_|-__|-___|-__|20_|-__|3_|40_| 60_|70__|-___|-
2008_________|-__|50_|10_|-___| -_|-__|-__|-__| -__|-___|50__|60		
2009_________|-__|10_|-__|20

Mit meiner CASE Funktion.

Jahr/Monat
_____________|1__|2__|3__|4__|5__|6__|7__|8__| 9__|10__|11__|12
2007_________|10_|10_|10_|10_|20_|20_|30_|40_| 60_|70__|70__|70
2008_________|-__|50_|10_|10_|10_|10_|10_|10_| 10_|10__|50__| 60		
2009_________|-__|10_|10_|20_|20_|20_|20_|20_| 20_|20__|20__|20


Das heisst, er füllt die Lücken mit den Vorgängerwerten aus, ausser im Januar.
Es ist also schon fast perfekt.

Nun dachte ich das ich das ganze verschachteln kann, es erscheint aber das gleiche Ergebnis wie oben...

//Wenn der aktuelle Monat 1 ist dann soll er das vorherige Jahr und den Monat 12 nehmen
CASE WHEN [DIM DATUM].[MONAT].Currentmember = 1
THEN
CASE WHEN NOT IsEmpty([Measures].[SOLL KUM]-[Measures].[HABEN KUM])
		  THEN [Measures].[SOLL KUM]-[Measures].[HABEN KUM]
		  ELSE (
				
				[DIM DATUM].[JAHR].prevmember,
				[DIM DATUM].[MONAT].&[12]
				)
	 END
ELSE
//sonst wie gehabt
CASE WHEN NOT IsEmpty([Measures].[SOLL KUM]-[Measures].[HABEN KUM])
		  THEN [Measures].[SOLL KUM]-[Measures].[HABEN KUM]
		  ELSE (
				[DIM DATUM].[Monat].PrevMember
				)
	 END
END


Den ersten Teil der Case Anweisung scheint er jedoch nie anzuspringen

Dieser Beitrag wurde von tavoc bearbeitet: 09. Juni 2009 - 13:35

your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#3 Mitglied ist offline   Christian123 

  • Gruppe: aktive Mitglieder
  • Beiträge: 39
  • Beigetreten: 12. Mai 07
  • Reputation: 0

geschrieben 07. November 2012 - 14:56

Hallo Tavoc, hallo Leute
ich habe ebenfalls ein ähnlich gelagertes Problem im MDX.

Wir errechnen die kumulierten Monats-Stück-Werte wie folgt:

SUM(PeriodsToDate([Zeit].[Monate].[Jahr],[Zeit].[Monate].CurrentMember), [Measures].[stck])

Im Januar stimmt soweit alles und auch die kum. Spaltensummenwerte werden in den Folgemonten korrekt in der Browserdarstellung ausgewiesen, wobei jedoch die Einzelkundensätze fehlen. Wenn man also die Einzelkunden der kumulierten Jahreswrete addiert, kommt man nicht auf den unten ausgewiesene richtigen Gesamtwert. Es werden nur kumulierte Werte angezeigt, wo es in dem Monate auch Montswerte gibt. Woran liegt das?

Gruß Chris
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0