PDA

View Full Version : SQL - case mit mehreren Summenbildung



Bobou
20-11-20, 12:43
Hallo zusammen,

ich hoffe hier jemand zu finden der mir beantworten kann, ob dass was ich vorhabe funktioniert und wenn ja wo mein Fehler liegt.

Ich möchte innerhalb einer CASE-Anweisung mehrere Summen Ausgaben.

Folgendes SQL-Statement funktioniert problemlos


SELECT sum(case when Rabatt <> 0,00 then (Menge * Einkaufspreis) else 0,00 end) FROM Tabelle

jetzt möchte ich auf gleicher Weise auch den Verkaufspreis errechnen, aber nicht jedesmal die CASE-Anweisung wiederholen.
Daher denke ich der Code könnte wie folgt aussehen (der nicht funktioniert). Kann mir jemand sagen wo mein Fehler liegt.



SELECT sum(case when Rabatt <> 0,00 then (Menge * Einkaufspreis), (Menge * Verkaufspreis) else 0,00, 0,00 end ) FROM Tabelle

Vielen Dank im Voraus

Andreas_Prouza
20-11-20, 12:50
Sowohl die Funktion SUM als auch die CASE Anweisung, können nur 1 Spalte zurückliefern.
Du könntest das ganze in 2 Subselects machen und die dann zusammenfügen.

Das könnte dann wie folgt aussehen.

with x as (
Select sp1, sp2, (Menge * Einkaufspreis) ME_EP, (Menge * Verkaufspreis) ME_VP from tab1
where Rabatt <> 0,00
),
x2 as (
select sp1, sp2, 0,00 , 0,00 from tab1
where Rabatt = 0
)
select * from x
union
select * from x2


lg Andreas

Bobou
20-11-20, 14:29
Hallo und Danke für die schnelle Antwort.

So wie geschrieben funktioniert es, aber leider hilft es mir nicht wirklich weiter.

Ich versuche mein Problem neu zu formulieren.

Ich habe eine größere "Grund" WHERE-Bedingung, möchte diese aber nicht bei jedem nachfolgenden Statement wiederholen (bzw. wenn Änderungen anstehen nicht an mehreren Punkten nacharbeiten).

Jetzt möchte ich ( in meinen Beispiel durch den Rabatt) herausfinden wie hoch der Einkaufs- und Verkaufswert mit gewährten Rabatt ist und wie hoch der Einkaufs- und Verkaufswert ist bei dem kein Rabatt gewährt wurde ( Ich weiß mein in meinen ersten Beispiel war das nicht ersichtlich).

Entscheidend wäre also für mich, wie ich mehrere Summen ermitteln kann ohne das ich die WHERE Bedingung mehrfach angeben muss und nur eine die eine ( evtl. auch zwei ) Feldabfragen die Summenbildung ausmachen.


Anbei das Statement was die Logik zeigen soll, aber leider nicht funktioniert.

SELECT sum(case when Rabatt <> 0,00 then (Menge * Einkaufspreis), (Menge * Verkaufspreis) else (Menge * Einkaufspreis), (Menge * Verkaufspreis) end ) FROM Tabelle
WHERE
Parameter = 1 and
Parameter2 = 2 and
Parameter3 = 3

Fuerchau
20-11-20, 14:35
Dafür ist am Besten eine CTE oder eine Derived Table.
In der CTE definierst du Feldnamen und Ergebnisse, im anschließenden Select beziehst du dich darauf:

with mytemptable as (

select f1, f2, f3, f4*f5 as fcalc
from mytable
where ...

)

select * from mytemptable
where fcalc = ....

CTE's kann man mehrere definieren, miteinander verjoinen, mit und ohne grouping usw. usw.

B.Hauser
20-11-20, 14:40
Wenn Du 4 Spalten haben möchtest, brauchst Du auch 4 Case Anweisungen.
Ansonsten ist die Frage-Stellung wirklich nicht klar.
Kannst Du vielleicht ein Beispiel für die "komplexe" WHERE-Bedingung angeben?
Ich bekomme das nämlich nicht mit der CASE-Anweisung unter einen Hut.

Birgitta

Bobou
20-11-20, 15:48
Hallo nochmal

Im Endeffekt ist die folgende Aussage die, die meine Frage beantwortet.
"Wenn Du 4 Spalten haben möchtest, brauchst Du auch 4 Case Anweisungen."

Vielen Dank für die Hilfe

Fuerchau
21-11-20, 08:59
Nun ja, du hattest auch die Frage gestellt, wie du die Wiederholung der Ausdrücke im Where verhindern kannst.

Übrigens könntest du auch einen Left join mit der Datei machen und den Join eingrenzen:

select sum(b.wert1 * preis), sum(b.wert2 * preis) ...
from mytable a
left join mytable b on a.key = b.key and b.rabatt <> 0

Durch den Left join erhältst du eben NULL wenn Rabatt = 0 und in der Formel ist das Ergebnis NULL wenn ein Operand = NULL.