Announcement

Collapse
No announcement yet.

Nur die Nachkommastellen ausgeben!?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nur die Nachkommastellen ausgeben!?

    Hallo zusammen,

    wie schaffe ich es (mit einem Select-Statement) , von einem Betrag nur die Nachkommastellen (ohne vorangehende Null) auszugeben?
    Ich habe es mit to_char versucht - bisher leider ohne Erfolg.

    Bsp: 411,12 € => 12 oder 0,13 € => 13


    Hat jemand eine Idee?


    Gruß

    Sandstorm

  • #2
    Originally posted by Sandstorm View Post
    Hallo zusammen,

    wie schaffe ich es (mit einem Select-Statement) , von einem Betrag nur die Nachkommastellen (ohne vorangehende Null) auszugeben?
    Ich habe es mit to_char versucht - bisher leider ohne Erfolg.

    Bsp: 411,12 € => 12 oder 0,13 € => 13


    Hat jemand eine Idee?


    Gruß

    Sandstorm
    - Hallo, versuchs mal so:

    SELECT SUBSTR(to_char(123.345),(select instr(to_char(123.345),'.',1,1) from dual) ) "Nachkommastellen"
    FROM DUAL;

    ....sieht zugegegebenermassen etwas nach Bastelei aus, aber so auf die schnelle :-)


    Gruss

    Comment


    • #3
      Hallo,

      habs gerade ausprobiert und bei mir kommt dann leider immer noch der vollständige Betrag raus!

      => 123,345


      Gruß

      Sandstorm

      Comment


      • #4
        Originally posted by Ulrich Vaid View Post
        - Hallo, versuchs mal so:

        SELECT SUBSTR(to_char(123.345),(select instr(to_char(123.345),'.',1,1) from dual) ) "Nachkommastellen"
        FROM DUAL;

        ....sieht zugegegebenermassen etwas nach Bastelei aus, aber so auf die schnelle :-)


        Gruss
        Damit funzt es zwar nicht, aber du hast mich auf ne Idee gebracht

        So gehts: select substr(123.45, instr('123.345','.',1,1)+1,2) from dual


        Gruß

        Sandstorm

        Comment


        • #5
          Originally posted by Sandstorm View Post
          Damit funzt es zwar nichtSandstorm
          - Dass liegt daran, dass bei dir das [,] als Dezimalzeichen fungiert, bei mir der [.]
          - Und, nein, deine Lösung funktioniert nicht, ausser deine Dezimalstellen sind immer 2-stellig

          --> select substr(123.45, instr('123.345','.',1,1)+1,2) from dual

          Da hast du einmal 123.45, und einmal 123.345 eingetragen, wenn beide werte 123.345 wären, würdest du als Resultat 34 bekommen, und das wäre ja falsch , oder ?

          Die Lösung, die ich dir vorgeschlagen habe, ist unabhängig von der Anzahl der Dezimalstellen. Ganz korrekt würde es sein, wenn du in der DB abfragst, welches Trennzeichen gerade verwendet wird und dieses dann dynamisch verwendest, so läuft es dann auch auf jeder Umgebung....
          Zuletzt editiert von Ulrich Vaid; 18.07.2007, 12:27.

          Comment


          • #6
            Originally posted by Ulrich Vaid View Post
            - Dass liegt daran, dass bei dir das [,] als Dezimalzeichen fungiert, bei mir der [.]
            - Und, nein, deine Lösung funktioniert nicht, ausser deine Dezimalstellen sind immer 2-stellig

            --> select substr(123.45, instr('123.345','.',1,1)+1,2) from dual

            Da hast du einmal 123.45, und einmal 123.345 eingetragen, wenn beide werte 123.345 wären, würdest du als Resultat 34 bekommen, und das wäre ja falsch , oder ?

            Die Lösung, die ich dir vorgeschlagen habe, ist unabhängig von der Anzahl der Dezimalstellen. Ganz korrekt würde es sein, wenn du in der DB abfragst, welches Trennzeichen gerade verwendet wird und dieses dann dynamisch verwendest, so läuft es dann auch auf jeder Umgebung....
            Meine Lösung funktioniert ganz prima - die drei Stellen, die ich im instr angegeben habe, waren ein Schreibfehler! Außerdem möchte ich nur zwei Stellen ausgeben! Ich könnte dann immer noch round drumherum schreiben!!

            Und nein - deine Lösung funktioniert so nicht!!! Es kommt definitiv immer die Zahl 123,45 heraus! Da muss man schon den Punkt durch ein Komma ersetzen. Und selbst wenn man das macht, hat man immer noch das Komma davor. In meiner Lösung werden nur die beiden Nachkommastellen ausgegen -die ich ausgeben möchte!
            Was man allerdings noch an meiner Lösung verbessern muss ist zum Beispiel to_char(123.45, ''999G999G999G990D00') hinzuzufügen , damit auch die Nachkommastellen ausgeben werden, die Null sind - bei derartigen Zahlen => 123

            Probier das doch mal im Toad aus!


            Gruß

            Sandstorm
            Zuletzt editiert von Sandstorm; 18.07.2007, 13:32.

            Comment


            • #7
              <<<<< Außerdem möchte ich nur zwei Stellen ausgeben! Ich könnte dann immer noch round drumherum schreiben!!
              >>>>>

              - Tut mir leid, dass mit den nur 2 Dezimalstellen war im Originalpost nicht implizit gefordert

              <<<<
              Und nein - deine Lösung funktioniert so nicht!!! Es kommt definitiv immer die Zahl 123,45 heraus! Da muss man schon den Punkt durch ein Komma ersetzen.
              >>>>

              - Ja, dass hatte ich ja auch geschrieben...ist halt umgebungsabhänig

              <<<<
              Und selbst wenn man das macht, hat man immer noch das Komma davor. In meiner Lösung werden nur die beiden Nachkommastellen ausgegen -die ich ausgeben möchte!
              >>>>

              - Ja, mein Fehler, die korrigierte Version siehe unten...

              SELECT SUBSTR(to_char(123.12),(select instr(to_char(123.12),'.',1,1)+1 from dual) ) "Nachkommastellen"
              FROM DUAL;

              --> Das [+1] vor [from dual] hat gefehlt, so hat es den Punkt noch mitgenommen...so ist es besser


              Guckst du :

              oracle@CHTHL-TUX-ORACLE2:/usr/data/oracle/scripting/dba> sqlplus m_ruma/m_ruma

              SQL*Plus: Release 9.2.0.7.0 - Production on Wed Jul 18 12:52:23 2007

              Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


              Connected to:
              Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
              With the Partitioning, OLAP and Oracle Data Mining options
              JServer Release 9.2.0.7.0 - Production

              SQL> spool test.txt
              SQL> SELECT SUBSTR(to_char(123.1234),(select instr(to_char(123.1234),'.',1,1)+1
              from dual) ) "Nachkommastellen"
              F 2 ROM DUAL;

              Nachkomm
              --------
              1234

              SQL> SELECT SUBSTR(to_char(123.12),(select instr(to_char(123.12),'.',1,1)+1 from
              dual) ) "Nachkommastellen"
              2 FROM DUAL;

              Nachko
              ------
              12

              SQL> spool off
              SQL> exit
              Disconnected from Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Producti
              on
              With the Partitioning, OLAP and Oracle Data Mining options
              JServer Release 9.2.0.7.0 - Production
              oracle@CHTHL-TUX-ORACLE2:/usr/data/oracle/scripting/dba>


              Gruss

              Comment


              • #8
                Umgebungsunabhängige Lösung

                Hallo Sandstorm,

                wie wäre es mit einer umgebungsunabhängigen Lösung?

                CREATE Table TBL( NUM number(10,4) )
                /

                Table created.

                INSERT into TBL Values( 1.2345 )
                /

                1 row created.

                SELECT round(mod(NUM,trunc(NUM)),1)*10 "Nachkommastellen" from TBL
                union all
                SELECT round(mod(NUM,trunc(NUM)),2)*100 "Nachkommastellen" from TBL
                union all
                SELECT round(mod(NUM,trunc(NUM)),3)*1000 "Nachkommastellen" from TBL
                union all
                SELECT round(mod(NUM,trunc(NUM)),4)*10000 "Nachkommastellen" from TBL
                /

                Nachkommastellen
                ----------------
                2
                23
                235
                2345

                4 rows selected.

                Gruß, Siegfried

                Comment

                Working...
                X