Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Summe aus Tabelle 1 mit Feld aus Tabelle 2 subtrahieren ... Gruppierungsproblem

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von chgs2013, 6 Januar 2015.

  1. chgs2013

    chgs2013 Aktiver Benutzer

    Hallo,

    ich habe bereits 3 mal versucht einen SQL-Query aufzubauen, komme aber leider nicht weiter.

    Ich habe 3 Tabellen, um das Versandgewicht für eine Kundenbestellung zu ermitteln.

    Tabelle 1 betrifft die Bestellungen (tBestellung)
    Tabelle 2 betrifft die Bestellpositionen (tBestellpositionen)
    Tabelle 3 betrifft die Artikelinformationen (tArtikel)


    Der Auftrag wird verpackt, die Versandwaage ermitteln das Gesamt-Versandgewicht und schreibt dieses in das Feld cVersandwaageGewicht in Tabelle 1 (tBestellung).

    Nun soll die Differenz ermittelt werden, sprich es muss für diesen Auftrag das Gesamtgewicht mit Hilfe der Artikelinformationen berechnet werden, was an sich klappt. Betrifft Tabelle 2+3.


    Aufbau Tabelle 1 (tBestellung):
    Code:
    kBestellungID     cVersandwaageGewicht
    AB-00001          1.050
    AB-00002          0.832
    AB-00003          1.763
    ...
    
    Aufbau Tabelle 2 (tBestellpositionen):
    Code:
    tBestellung_kBestellungID     kArtikel   nAnzahl
    AB-00001                      111        1
    AB-00001                      222        2
    AB-00002
    ...
    
    Aufbau Tabelle 3 (tArtikel):
    Code:
    tArtikel_kArtikel   fGewicht
    111                 0.125
    222                 0.325
    333
    ...
    

    Mein aktueller Versuch sieht so aus:
    Code:
    SELECT   CAST(isnull(cVersandwaageGewicht,0) as Decimal(10,4)) - (SELECT   CAST(isnull(SUM(tArtikel.fGewicht * nAnzahl),0) as Decimal(10,4))
    FROM   tbestellpos INNER JOIN
         tbestellung ON tBestellpositionen.tBestellung_kBestellungID = tBestellung.kBestellungID INNER JOIN
         tArtikel ON tBestellpositionen.tArtikel_kArtikel = tArtikel.kArtikel
    WHERE   tBestellung.kBestellungID = tBestellpositionen.tBestellung_kBestellungID)
    FROM   tbestellung
    GROUP BY tBestellung.kBestellungID
    
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Auch nach 3maligem lesen finde ich die Frage nicht ;-)

    Ohne das jetzt nachgespielt zu haben scheint ja Dein 'Versuch' zu funktionieren. (Zitat: "Nun soll die Differenz ermittelt werden, sprich es muss für diesen Auftrag das Gesamtgewicht mit Hilfe der Artikelinformationen berechnet werden, was an sich klappt. Betrifft Tabelle 2+3.")
     
  3. chgs2013

    chgs2013 Aktiver Benutzer

    Ich habe 2 Select-Abfragen verschachtelt, ich will nun jeden Auftrag für sich berechnen lassen.

    Ich habe es mit der direkten BestellungID versucht, da klappt es speziell in diesem Fall:
    Code:
    SELECT   CAST(isnull(cVersandwaageGewicht,0) as Decimal(10,4)) - (SELECT   CAST(isnull(SUM(tArtikel.fGewicht * nAnzahl),0) as Decimal(10,4))
    FROM   tbestellpos INNER JOIN
         tbestellung ON tBestellpositionen.tBestellung_kBestellungID = tBestellung.kBestellungID INNER JOIN
         tArtikel ON tBestellpositionen.tArtikel_kArtikel = tArtikel.kArtikel
    WHERE   tBestellpositionen.tBestellung_kBestellungID = 'AB-00001')
    FROM   tbestellung
    WHERE   tBestellung.kBestellungID = 'AB-00001'
    

    Ich möchte dies nun für alle Bestellungen tun, da kam ich dann leider nicht weiter, weil die 2 Spalten in den 2 Tabellen zur Indentifizierung unterschiedlich lauten.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Sorry, aber ich sehe da jetzt nicht wirklich das Problem. Ich kann das aber auch schlecht nachvollziehen, M$SQL läuft halt ned unter Linux... Aber unterschiedliche Spaltennamen sind bei einem JOIN einklich kein Problem - wie man so sagt: Namen sind Schall und Rauch ...
     
  5. chgs2013

    chgs2013 Aktiver Benutzer

    Ich versuchs anders, meine 2 SELECTs funktionieren getrennt voneinander, speziell für eine Bestellnummer!

    Nur wenn ich ALLE Bestellungen jeweils für sich berechnen und subrtrahieren will, bekomme ich Ausgabefehler, ich schaffe es also nicht sauber die 2 SELECTs zu verknüpfen. Ich habe dann gelesen, dass man die BestellungsID noch Gruppieren muss, bei 2 verschachtelten SELECTs tue ich mich aber schwer.

    MSSQL schmeisst im Grunde ALLE Gewichtssummen von allen Auftragen zusammen, berücksichtigt also nicht getrennt jeden Auftrag.


    Hier wird mir korrekt für tBestellung.kBestellungID '111' das Versandgewicht ausgegeben:
    Code:
    SELECT   CAST(isnull(cVersandwaageGewicht,0) as Decimal(10,4))
    FROM   tbestellung
    WHERE   tBestellung.kBestellungID = '111'
    
    Hier wird gesamtes Auftragsgewicht berechnet für die tBestellpositionen.tBestellung_kBestellungID '111':
    Code:
    SELECT   CAST(isnull(SUM(tArtikel.fGewicht * nAnzahl),0) as Decimal(10,4))
    FROM   tbestellpos INNER JOIN
         tbestellung ON tBestellpositionen.tBestellung_kBestellungID = tBestellung.kBestellungID INNER JOIN
         tArtikel ON tBestellpositionen.tArtikel_kArtikel = tArtikel.kArtikel
    WHERE   tBestellpositionen.tBestellung_kBestellungID = '111'
    
     
  6. Distrilec

    Distrilec Datenbank-Guru

    Code:
    Select kbestellungid,
           sum(cversandwaagegewicht - Sum(nanzahl * fgewicht))
    From   (Select best.kbestellungid,
                   best.cversandwaagegewicht,
                   posi.nanzahl,
                   arti.fgewicht
            From   tbestellung best
            Inner  Join tbestellpositionen posi
            On     best.id = posi.tbestellung_kbestellungid
            Inner  Join tartikel arti
            On     posi.kartikel = arti.tartikel_kartikel)
    Where  kbestellungid = 'AB-00001'
    Group  By kbestellungid 
    Suchst du sowas ?

    (Ich hatte noch keinen Kaffee ^^)
     
  7. ukulele

    ukulele Datenbank-Guru

    Das sollte auch funktionieren und das selbe liefern wie das von Distrilec:
    Code:
    SELECT    b.kBestellungID,
           b. cVersandwaageGewicht,
            sum(p.nanzahl * a.fgewicht) AS ArtikelGewicht,
            sum(b.cVersandwaageGewicht - sum(p.nanzahl * a.fgewicht)) AS GewichtDifferenz
    FROM    tBestellung b
    LEFT JOIN tBestellpositionen p
    ON        b.kBestellungID = p.tBestellung_kBestellungID
    LEFT JOIN tArtikel a
    ON        p.kArtikel = a.tArtikel_kArtikel
    GROUP BY kBestellungID,cVersandwaageGewicht
     
  8. chgs2013

    chgs2013 Aktiver Benutzer

    Wow, danke ... solangsam verstehe ich, wie man dies verkettet, cool muss das bissel übel.


    Hattest einen kleinen Fehler zum Schluß mit Artikel:
    Code:
    SELECT  b.kBestellungID,
      b. cVersandwaageGewicht,
      sum(p.nAnzahl * a.fGewicht) AS ArtikelGewicht,
      sum(b.cVersandwaageGewicht - sum(p.nAnzahl * a.fGewicht)) AS GewichtDifferenz
    FROM  tBestellung b
    LEFT JOIN tBestellpositionen p
    ON  b.kBestellungID = p.tBestellung_kBestellungID
    LEFT JOIN tArtikel a
    ON  p.tArtikel_kArtikel = a.kArtikel
    GROUP BY kBestellungID,cVersandwaageGewicht
    
    So, Formel scheint zu passen, gab keine Fehler bzgl. der Formel, nur die Auswertung klappt noch nicht!


    Es heißt:
    Meldung 130, Ebene 15, Status 1, Zeile 4
    Eine Aggregatfunktion kann auf einem Ausdruck, der ein Aggregat oder eine Unterabfrage enthält, nicht ausgeführt werden.
     
  9. chgs2013

    chgs2013 Aktiver Benutzer

    OK mein Fehler, ein paar Zeilen hatten kein "NULL", sondern waren einfach "BLANK"!

    Wie kann ich noch gleich bei cVersandwaageGewicht ein NULL oder BLANK abfangen?
    Darum stoppte auch die Berechnung *grummel*
     
  10. ukulele

    ukulele Datenbank-Guru

    Wenn du mit Blank einen 0 Zeichen langen Char meinst dann stellt sich mir die Frage: Warum zur Hölle speicherst du eine Zahl als Char? NULL ist in der Berechnung kein Problem, "" müsstest du mit einer CASE Answeisung abfangen, aber da wäre auch eine Änderung des Datentyps dringend zu empfehlen.
    Code:
    CASE WHEN b.cVersandwaageGewicht = '' THEN NULL ELSE b.cVersandwaageGewicht END
     
  11. chgs2013

    chgs2013 Aktiver Benutzer

    Mein Programm hatte unsaubere Werte an die Tabelle übergeben, konnte das Problem lösen.

    Leider hänge ich jetzt bei der Update Funktion, weil die Unterabfrage zu viele Werte hat :(

    Problem ist wohl, dass per Update eine gezielte Bestellung gesucht wurde, aber der Select nun alle einzelnen in EINE Bestellung schreiben will.
    Dies darf natürlich nicht sein, wollte daher GROUP BY bei UPDATE verwenden, was aber nicht mögich ist. Was mache ich falsch?


    Wie kann ich nun den UPDATE mit der Unterabfrage von unserem SELECT verbinden?

    Code:
    UPDATE tbestellung
    SET fGewichtsermittlung=
       (SELECT     CAST(isnull(b.cVersandwaageGewicht,0) as Decimal(10,4)) - CAST(isnull(SUM(a.fGewicht * p.nAnzahl),0) as Decimal(10,4)) AS GewichtDifferenz
       FROM     tBestellung b
             LEFT JOIN   tbestellpos p
             ON       b.kBestellungID = p.tBestellung_kBestellungID
             LEFT JOIN   tArtikel a
             ON       p.tArtikel_kArtikel = a.kArtikel
       GROUP BY   kBestellungID,cVersandwaageGewicht)
    WHERE cVersandwaageGewicht IS NOT NULL
    
     
  12. ukulele

    ukulele Datenbank-Guru

    Du musst UPDATE mit einem JOIN kombinieren, in etwa so:
    Code:
    UPDATE    t1
    SET        t1.fGewichtsermittlung = t2.GewichtDifferenz
    FROM    tbestellung t1
    INNER JOIN (
    
    SELECT    b.kBestellungID,
            cast(isnull(b.cVersandwaageGewicht,0) AS DECIMAL(10,4)) -
            cast(isnull(sum(a.fGewicht * p.nAnzahl),0) AS DECIMAL(10,4)) AS GewichtDifferenz
    FROM    tBestellung b
    LEFT JOIN tbestellpos p
    ON        b.kBestellungID = p.tBestellung_kBestellungID
    LEFT JOIN tArtikel a
    ON        p.tArtikel_kArtikel = a.kArtikel
    GROUP BY kBestellungID,cVersandwaageGewicht
    
            ) t2
    ON        t1.kBestellungID = t2.kBestellungID
    WHERE    t1.cVersandwaageGewicht IS NOT NULL
     
  13. chgs2013

    chgs2013 Aktiver Benutzer

    Danke für deine Hilfe, ich hatte es viel einfacher noch gelöst gerade :)


    Code:
    UPDATE tbestellung
    SET fGewichtsermittlung=
    (SELECT CAST(isnull(b.cVersandwaageGewicht,0) as Decimal(10,4)) - CAST(isnull(SUM(a.fGewicht * p.nAnzahl),0) as Decimal(10,4)) AS GewichtDifferenz
    FROM tBestellung b
    LEFT JOIN tbestellpos p
    ON b.kBestellungID = p.tBestellung_kBestellungID
    LEFT JOIN tArtikel a
    ON p.tArtikel_kArtikel = a.kArtikel
    WHERE b.kBestellungID = tbestellung.kBestellungID
    GROUP BY kBestellungID,cVersandwaageGewicht)
    WHERE cVersandwaageGewicht IS NOT NULL
    
    Ich werde aber dein Ansatz testen ;)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden