none
Viele-viele Nachkommastellen bei Werten aus Openquery MDX Abfrage - wie runde ich am Besten Auf/Ab? RRS feed

  • Frage

  • Liebe Experten,

    meine erste Frage betrifft die Entstehung von vielen Nachkommarstellen. Warum ein Wert von 50 verwandelt sich durch die Openquery bzw. Openrowset in eine Irrazionale Zahl? Ich muss allerdings sagen dass im Cube sind die Spalten als "Double" Datentyp deklariert (das ist aber auch das Einzige was außer "Currency" was sich angebot, um Dezimalzahlen abzubilden)...

    Format String: #,##0.00;-#,##0.00

    SQL Server 2014 SP3 Business Intelligence Version

    SQL OPENQUERY:

    MDX:

    Zweitens, wie könnte ich die Zahlen so universal runden, das sie nicht verfälscht werden. Mein aktuelles Verfahren scheint nicht die Richtige zu sein (den "ABS" habe ich eingefügt wegen evtl. negativen Zahlen):

    , ceiling(abs(convert(float,"[Measures].[Order Weight]"))
    	*sign(convert(float,"[Measures].[Order Weight]"))*2)/2.0 as [Gesamt Absatz]

    Danke und Gruß

    Irina


    Irina








    • Bearbeitet soarian2 Freitag, 27. September 2019 13:35
    Freitag, 27. September 2019 12:26

Antworten

  • Hallo Irina,

    eigentlich reicht die Format Anweisung völlig aus, allerdings sind das Meta-Daten die der Client interpretieren muss. MS Excel kann die Format-Anweisung vernünftig umsetzten, aber nicht SSMS wenn Du über OpenQuery die Daten abrufst.

    Du kannst in MDX alle Excel-Funktionen verwenden inkl. VBA und da gibt es die ROUND Funktion =>

    =VBA!ROUND(Measures.[Order Weight], 2)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert soarian2 Montag, 30. September 2019 10:22
    Montag, 30. September 2019 08:09

Alle Antworten

  • Das liegt an der Speicherungsform Double, Float oder Real.
    Fließkommazahlen sind halt in den Nachkommastellen ungenau da die Speicherungsform in "+/-0 - 0,5 * 2^n" gespeichert sind. Vorkommastellen sind sehr gut als 2er-Kombinationen darstellbar (1+2+4+8+...).
    Bei den Nachkommastellen sind es aber Brüche (1/2, 1/4, 1/8, ...) so dass es hier zu Näherungswerten kommt.

    Für eine genaue Speicherform gibt es den Typ Decimal bzw. Numeric.
    Hier kann man die genau Anzahl Stellen (bis max. 38) und Nachkomma angeben.
    https://docs.microsoft.com/de-de/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-2017

    Man kann eine Zahl auch in Decimal casten.
    Ansonsten gibt es die Funktion Round:
    https://docs.microsoft.com/de-de/sql/t-sql/functions/round-transact-sql?view=sql-server-2017

    Wobei hier das Ergebnis wieder ungenau sein kann, wenn damit weitergerechnet wird, also innerhalb eines Ausdrucks.


    • Bearbeitet bfuerchau Freitag, 27. September 2019 13:33
    Freitag, 27. September 2019 13:33
  • Danke für die Antwort.

    Leider habe im SSAS kein Decimal Datentype finden können, sondern nur Double, Integer und Currency.

    beim Custing in Decimal und Raund Funktion verfelschen sich die Werte. Salopp gefragt: wie kann ich die 49.79999999999997 in 50 aufrunden, damit 2.7 unberürt bleibt?


    Irina

    Freitag, 27. September 2019 13:51
  • Gedanklich so erst mal gar nicht.
    Ist der Wert 49,799 in derselben Spalte wie 2,7? Wenn ja, so ist die Datenquelle zu überprüfen.
    Ansonsten, wenn 2 NK gewünscht werden, käme eben 49,80 und 2,70 heraus.

    Für SSAS gibt es folgende Möglichkeiten:
    https://stackoverflow.com/questions/4998431/any-way-to-control-number-of-decimal-places-while-browsing-ssas-cube

    Allerdings muss man dabei immer noch beachten, dass zwar die Ausgabe formatiert wird, eine Berechnung aber mit dem Originalwert erfolgt.

    Für die SQL-Round-Funktion muss der SQL der Abfrage enstsprechend angepasst werden.

    Freitag, 27. September 2019 14:57
  • Hallo Irina,

    eigentlich reicht die Format Anweisung völlig aus, allerdings sind das Meta-Daten die der Client interpretieren muss. MS Excel kann die Format-Anweisung vernünftig umsetzten, aber nicht SSMS wenn Du über OpenQuery die Daten abrufst.

    Du kannst in MDX alle Excel-Funktionen verwenden inkl. VBA und da gibt es die ROUND Funktion =>

    =VBA!ROUND(Measures.[Order Weight], 2)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert soarian2 Montag, 30. September 2019 10:22
    Montag, 30. September 2019 08:09
  • Hallo Olaf,

    Die Werte werden durch SSRS Atonement in Excel format verschickt. Ich müsste leider feststellen dass für SSRS reichte die Format Anweisung auch nicht aus. Die Zahlen werden ja auch durch 1000 dividiert, deswegen habe das hier verwendet:

    =VBA!ROUND(Measures.[Order Weight], 3)

    Vielen herzlichen DanK!!!

    Grüße

    Irina


    Irina

    Montag, 30. September 2019 11:07
  • In SSRS kannst Du in den Eigenschaften der TextBox Format=N3 angeben, dann wird die Zahl mit 3 Nachkommastellen formatiert; auch beim Excel Export.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 30. September 2019 11:13