[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Nov 2006
    Beiträge
    60

    SQL - case mit mehreren Summenbildung

    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

    Code:
    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.


    Code:
    SELECT sum(case when Rabatt <> 0,00 then (Menge * Einkaufspreis), (Menge * Verkaufspreis) else 0,00, 0,00 end ) FROM Tabelle
    Vielen Dank im Voraus

  2. #2
    Registriert seit
    Nov 2020
    Beiträge
    327
    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.
    Code:
    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

  3. #3
    Registriert seit
    Nov 2006
    Beiträge
    60
    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.
    Code:
     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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Nov 2006
    Beiträge
    60
    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SQL CASE bei WHERE
    By DKSPROFI in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-01-19, 14:05
  2. SQL Update Case Berechnung
    By Holzwurm1973 in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 27-09-17, 14:49
  3. CASE in Kombination mit IN
    By mojo in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 27-05-15, 11:01
  4. Optimierung beim Sql-Case
    By fpxx in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 19-05-15, 11:42
  5. SQL Datumsabfrage aus case Feld
    By mk in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 29-08-14, 09:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •