Rolf b: MySQL SUM mit GROUP Problem

Beitrag lesen

Nee, SUM über SUM geht nicht, kann nicht gehen. Dafür bräuchtest Du sowas wie ein mehrstufiges GROUP BY, sonst ergibt das keinen Sinn.

Bei Dir kommt noch hinzu, dass Du die Artikel-Tabelle nun mit zwei anderen Tabellen verknüpfst, und die Gruppierung pro abhängiger Tabelle getrennt laufen muss. Das geht mit JOIN - tjaaa - zwar irgendwie schon, aber du musst dann sowas bilden wie
(Artikel JOIN Lager GROUP BY ArtNr) JOIN (Artikel JOIN History GROUP BY ArtNr)
Das ist mega-umständlich. Ob auch langsamer - keine Ahnung, das hängt davon ab wie schlau der Optimizer im SQL Server ist.

Mit Dedlfixens Subselects ist es jedenfalls einfacher. Da gruppierst Du nämlich nicht, sondern wählst pro Artikel über die WHERE Bedingung die relevanten Sätze der abhängigen Tabellen aus. Wenn Du zu einem Artikel gar keinen Lager- oder History-Satz hast, liefert der Subselect allerdings NULL, das solltest Du per COALESCE zu 0 machen. Achso - mir fällt grad auf: Dedlfix hat SUM((SELECT ...)) verwendet, ich habe (SELECT SUM(Menge)) geschrieben - die SUM((SELECT...)) Schreibweise scheint im MS SQL Server nicht zu gehen: "Cannot perform an aggregate function on an expression containing an aggregate or a subquery."

select A.ArtNr, 
       (COALESCE((SELECT SUM(Menge) FROM Lager L WHERE A.ArtNr=L.ArtNr), 0)
       - COALESCE((SELECT SUM(Menge) FROM History H WHERE A.ArtNr=H.ArtNr AND **datum passt**), 0)) * EK
FROM artikel A

Für datum passt setze die Abfrage deines Vertrauens ein.

Das passt so nicht ganz zu deinen Tables, aber das kannst Du bestimmt hinbiegen.

Rolf