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

chgs2013

Aktiver Benutzer
Beiträge
37
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
 
Werbung:
Hallo,

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

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.")
 
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.
 
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.

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 ...
 
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'
 
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 ^^)
 
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
 
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

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.
 
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*
 
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
 
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
 
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
 
Werbung:
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 ;)
 
Zurück
Oben