[Oracle] Summe ohne Dezimalzeichen

m3000

Erfahrenes Mitglied
Hallo,

in meiner DB sind Geld-Spalten als CHAR definiert. Ein Inhalt von '123456' bedeutet also zB: "1234 Euro und 56 Cent". Kann ich das select so verfeinern, dass er mir ein Dezimalzeichen einfügt, also "1234.56" ausgibt? Oder, besser noch, "1'234.56"?

Dank und Gruss
Marcus
 
Sicher geht das, es ist nur mit etwas Konvertierungsaufwand für die Datenbank verbunden. Ist nicht gerade optimal was das "Datenmodell" betrifft einen Betrag als Text abzulegen.

SQL:
SQL> select * from geld;

BETRAG
--------------------------------------------------
123456

SQL> alter session set nls_numeric_characters='.''';

Session wurde geandert.

SQL> select TO_CHAR( TO_NUMBER( betrag  ) / 100, '999G990D00' ) as betrag from geld;

BETRAG
-----------
   1'234.56

Wenn du jetzt wieder einen Text anstatt einer Zahl haben willst, musst du die Spalte wieder mit TO_CHAR( ... ) umwandeln.
 
Zuletzt bearbeitet von einem Moderator:
Hallo E'Fault,

muss das Thema leider doch noch mal öffnen. Im Kurztest klappte es ja gut, aber nachdem ich es in mein Skript eingebaut habe, will dort das sum-mieren über break on und compute sum nicht mehr. Da auch noch ein decode und eine innere Summierung dabei sind, führe ich mal sicherheitshalber das ganze Statement vor:
Code:
break on JJJJMM dup on Budget dup

compute sum label "Summe: " of SOLL on JJJJMM
compute sum label "Summe: " of HABEN on JJJJMM

select
 substr(zahldatum,1,6) as "JJJJMM",
 rtrim(substrb(codebudget,1,20)) "Budget",
 decode(zahltyp,'C',TO_CHAR(TO_NUMBER(sum(betrag)) / 100, '999G990D00')) as "HABEN",
 decode(zahltyp,'D',TO_CHAR(TO_NUMBER(sum(betrag)) / 100, '999G990D00')) as "SOLL"
from tab1
where substr(zahldatum,1,4) = '2006'
group by substr(zahldatum,1,6), substrb(codebudget,1,20), zahltyp, zahltyp;
In der Ausgabe sind die *-Zeichenzeilen für das group-Ende, unter denen sonst die Summierung kommt, noch enthalten. Nicht aber der Text "Summe: " und die Berechnung. Vorher ging's. Wie kann ich das wieder herstellen?

Dank und Gruss
Marcus
 
Oh du baust einen SQL*Plus Report, OK.
Das compute funktioniert natürlich nur, wenn du auch Spalten mit numerischem Typ angibst, die Formatierung der Spakte mit TO_CHAR macht dir den Report kaputt.
Ich hab das mal schnell nachvollzogen und es geht wenn du die Spalten SOLL und HABEN in SQL formatierst:

SQL:
mydev> select
  2   substr(zahldatum,1,6) as "JJJJMM",
  3   rtrim(substrb(codebudget,1,20)) "Budget",
  4   decode(zahltyp,'C', TO_NUMBER(sum(betrag) / 100 )) as "HABEN",
  5   decode(zahltyp,'D', TO_NUMBER(sum(betrag) / 100 )) as "SOLL"
  6  from tab1
  7  where substr(zahldatum,1,4) = '2006'
  8  group by substr(zahldatum,1,6), substrb(codebudget,1,20), zahltyp;

JJJJMM             Budget                HABEN            SOLL
------------------ ----------- --------------- ---------------
200604             Mein Budg                             152,3
****************** *********** --------------- ---------------
Summe:                                                   152,3
200605             Me122Budget                         1000,35
200605             Mein Budget         1560,25
****************** *********** --------------- ---------------
Summe:                                 1560,25         1000,35

3 Zeilen ausgewõhlt.

mydev> alter session set nls_numeric_characters = '.''';

Session wurde geõndert.

mydev> COL HABEN ON FORMAT 999G990D00
mydev> COL SOLL ON FORMAT 999G990D00
mydev> select
2   substr(zahldatum,1,6) as "JJJJMM",
3   rtrim(substrb(codebudget,1,20)) "Budget",
4   decode(zahltyp,'C', TO_NUMBER(sum(betrag) / 100 )) as "HABEN",
5   decode(zahltyp,'D', TO_NUMBER(sum(betrag) / 100 )) as "SOLL"
6  from tab1
7  where substr(zahldatum,1,4) = '2006'
8  group by substr(zahldatum,1,6), substrb(codebudget,1,20), zahltyp;

JJJJMM             Budget            HABEN        SOLL
------------------ ----------- ----------- -----------
200604             Mein Budg                    152.30
****************** *********** ----------- -----------
Summe:                                          152.30
200605             Me122Budget                1'000.35
200605             Mein Budget    1'560.25
****************** *********** ----------- -----------
Summe:                            1'560.25    1'000.35

3 Zeilen ausgewõhlt.
 
Zuletzt bearbeitet von einem Moderator:
Bin leider erfolglos, das Ergebnis ist unverändert. Übersehe ich noch was, oder hast Du wirklich nur die beiden COLumn-Zeilen ergänzt? Übrigens kenne ich das "ON" darin nicht, was soll das machen? Es funktioniert jedenfalls mit und ohne ON nicht. - Noch eine Idee?

Dank und Gruss, Marcus
 
Das ON definiert einfach ob die Formatierung für die Spalte die du definiert hast nun gilt oder nicht. ON ist der Default, daher eigentlich unnötig. Nur wenn man viel mit Scripten arbeitet kann man ja nie wissen was vorher schon so alles formatiert wurde, daher verlasse ich mich eigentlich nie auf die Defaultwerte.

Und folgendes habe ich noch geändert:
SQL:
Deins:
decode(zahltyp,'C',TO_CHAR(TO_NUMBER(sum(betrag)) / 100, '999G990D00')) as "HABEN",
Meins:
decode(zahltyp,'C', TO_NUMBER(sum(betrag) / 100 )) AS "HABEN",

Das TO_CHAR muss weg, sodass Oracle mit Zahlen arbeitet, sonst klappt wie gesagt dein COMPUTE nicht.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück