SQL Innerhalb einer Abfrage nach Bedarf eine Berechnung durchführen

hemorieder

Lieutenant
Registriert
März 2003
Beiträge
649
Hey,

ich habe folgende Situation, ich habe eine Datenbank welche Bestellmengen und Produktpreise enthält.
Nun ist es so, dass einige Produktpreise nicht in Euro sind. Ich kann genau sagen, in welchem Fall ein Produktpreis umgerechnet werden sollte.
Meine Frage ist nun, kann ich innerhalb der Abfrage dies schon berücksichtigen? Z.b mit CASE?

Hier meine aktuelle Abfrage:

SQL:
select
case when( oi.client_type is null) then os.client_type else oi.client_type end as Client,
count(distinct o.order_id) as Orders,
round((sum(oi.product_price))/100::numeric,2) as Bruttoumsatz
from order o
left join orderitem oi using (order_id)
left join product p using (product_id)
left join order_source os using (order_id)
where created >='2021-04-01'
and created < '2021-08-01'
and o.po_id in (1234,0000,1111,2222)
and o.test_status is null
and o.status in ('X', 'Y', 'Z')
group by client
order by client

In dem Fall stimmt das Ergebnis des Umsatzes nicht, da nämlich beim o.po_id = 1111 , die Währung Schweizer Franken ist.
Kann ich nun irgendwie die Abfrage so modifizieren, dass wenn es sich gerade bei der gefundenen Bestellung um eine solche von o.po_id = 1111 handelt, die Summe der Produktpreise *0,93 gerechnet wird (Wechselkurs des Franken).

Versteht ihr was ich meine?

Lg
 
Ich drücke es mal so aus: Eine Datenbank ist ein Daten*speicher*, der mittels SQL strukturierten Zugriff auf ausgewählte Daten gewährt. Eine Datenbank ersetzt aber keine Software, die diese Daten verarbeitet. Nicht alles lässt sich mittels SQL lösen und selbst wenn das ginge, heißt das noch lange nicht, dass man das auch tun sollte.

Im klassischen Softwaredesign spricht man von 3 Schichten

  • data access layer -> Datenbank mit SQL
  • logic layer -> Software, die die Daten verarbeitet
  • presentation layer -> Benutzeroberfläche

Du versuchst gerade scheinbar, die Verarbeitung der Daten in die Datenbank zu legen, obwohl sie tendenziell in die Software gehört, die die Datenbank bedient und die Daten für die GUI aufbereitet.

Es stellt sich daher die Frage: Wo und wie stellst du die Daten denn dar? Sind komplexe Skripte dort nicht besser aufgehoben, um die abgerufenen Daten gemäß deiner Wünsche zu bearbeiten?
 
  • Gefällt mir
Reaktionen: Cool Master
Das Problem würde sich mM mit SQL einfach lösen lassen, wenn du eine extra Spalte hättest in dem die Währung gespeichert wird. Aktuell versuchst du, dass SQL einen Wert selbst interpretiert, der kein bekannter Datentyp ist bzw. nicht atomar ist, vielleicht lässt sich das lösen, aber das ist es die Mühe doch nicht wert, oder?
 
  • Gefällt mir
Reaktionen: imRa
Um das Sinnhaft und nachhaltig zu lösen brauchst du eine Wechselkurs-/Währungstabelle, die regelmäßg mit den aktuellen Kursen gepflegt wird und ein extra Feld in deiner Orderitem-Tabelle, das angibt, um welche Währung es sich handelt.
Das kannst du dann einfach joinen und den Wechselkurs in die Preisberechnung einfließen lassen.

Die Frage ist hier aber auch, was du tatsächlich erreichen willst.
Je nachdem musst du dir dann auch noch Gedanken um z.B. Steuersätze, Zoll und andere preisverändernde Tatsachen machen, da die ja auch länderspezifisch sind.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mental.dIseASe und nioyot
Zurück
Oben