![]() |
Datenbank: Oracle • Version: 10 • Zugriff über: ADO
Währungsumrechnung mit decode()
Allo zusammen,
bei dieser abfrage bekommt der ADO-Treiber einen über sich:
Code:
Meldung:
select country
,to_char(sum(amount),'9999990D00') ,currency ,decode(currency,'USD',to_char(sum(amount)/1.25,'9999990D00') ,'SEK',to_char(sum(amount)/9.15,'9999990D00') ,'NOK',to_char(sum(amount)/8.38,'9999990D00') ,'GBP',to_char(sum(amount)/0.79,'9999990D00')) Zitat:
SQL-Code:
?
decode
(Es mit Hilfe von
SQL-Code:
zu lösen halte ich für nicht so optimal)
union
Gruß und vielen Dank im vorraus K-H |
AW: Währungsumrechnung mit decode()
Vielleicht reich ja für eine einmalige Sache eine Umformulierung:
SQL-Code:
oder
Select
country, currency, to_char(amount,'9999990D00') as amount, decode(currency,'USD',to_char(amount/1.25,'9999990D00') ,'SEK',to_char(amount/9.15,'9999990D00') ,'NOK',to_char(amount/8.38,'9999990D00') ,'GBP',to_char(amount/0.79,'9999990D00') ,null ) as CalculatedAmount From ( Select Distinct country ,sum(amount) as amount,currency From Tabelle )
SQL-Code:
Wichtig ist natürlich irgendein Grouping (bei mir durch distinct). Erwähne ich nur, weil das aus deinem Post nicht hervorgeht.
Select
country, currency, to_char(amount,'9999990D00') as amount, decode(currency,'USD',amountUSD) ,'SEK',amountSEK) ,'NOK',amountNOK) ,'GBP',amountGBP) ,null ) as CalculatedAmount From ( Select Distinct country,currency, sum(amount) as amount, to_char(sum(amount)/1.25,'9999990D00') as amountusd, to_char(sum(amount)/9.15,'9999990D00') as amountsek, ... From Tabelle ) |
AW: Währungsumrechnung mit decode()
Danke! muß ich mal ausprobieren.
Ein Kollege hat mir folgenden Tip gegeben der wohl funktioniert:
Code:
vielen Dank nochmal
select country
,to_char(sum(amount),'9999990D00') ,currency ,case currency when 'USD' then to_char(sum(amount)/1.25,'9999990D00') when 'SEK' then to_char(sum(amount)/9.15,'9999990D00') when 'NOK' then to_char(sum(amount)/8.38,'9999990D00') when 'GBP' then to_char(sum(amount)/0.79,'9999990D00') else ' ??? ' end inEuro Gruß K-H Nachtrag: Zitat:
|
AW: Währungsumrechnung mit decode()
Ich wär mir nicht sicher, dass es an der Menge der Elemente liegt.
Eher der Typ der Ausgabe von decode. Die kann ja Text, Date usw sein. Decode bzw Oracle weiß zu Begin des Aufrufes selbst nicht, welchen Typ das Ergebnis hat und bestimmt das nach irgendeinem definierten Verfahren. Wenn man das nicht berücksichtigt, fliegt auch gleich das Decode auf die Nase. Ich glaube es ist sowas wie: Spaltenergebnis Typ = Typ der erstmaligen Auswertung oder sowas. Naja und wenn der Server da schon so nachdenken muss, dann Ado erst Recht. Ein Union könnte also dem Treiber helfen, indem man eine Dummyzeile an den Anfang setzt mit einem Texttyp für die Spalte. (Muss im Endergebnis natürlich wieder verschwinden) Ansonsten noch ein Union, der alle Währungen mit Faktor aufführt und zur Hauptabfrage gejoined wird, dann ist das ganze decode raus. Aber ist ja eh gelöst. |
AW: Währungsumrechnung mit decode()
Wenn du abhängig von currency die passende Umrechnung haben möchtest, warum dann keine separate Währungstabelle und die per JOIN dazunehmen?
Dieses Geschreibsel ist doch nur unübersichtlich und auch noch schlecht wartbar.
SQL-Code:
Wenn du auch unbekannte Währungen berücksichtigen musst, dann eben ein LEFT JOIN
select country
,to_char(sum(amount),'9999990D00') ,currency ,to_char(sum(amount)/curr.factor,'9999990D00') join curr on curr.code = currency |
AW: Währungsumrechnung mit decode()
@jobo
Das ist eine interessante Idee, mal schauen ob man mit dem Union was erreichen kann. @Sir Rufo Das ist nur eine ad hoc Lösung, da die zugehörige Währungstabelle sehr individuelle Daten enthält und ich eine schnelle Lösung brauchte. Sobald klar ist mit welchen Faktoren die Umrechnung vorgenommen werden soll, werde ich eine Standardlösung implementieren. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz