Registriert seit: 27. Nov 2017
2.529 Beiträge
Delphi 7 Professional
|
AW: Count in SQL mit Left Join
24. Jan 2025, 00:27
Habe das SQL mal umformatiert, damit es für mich lesbarer und etwas verständlicher wird:
SQL-Code:
SELECT
SUM(A.Netto) AS Netto,
SUM(A.MwSt) AS MwSt,
SUM(A.Brutto) AS Brutto,
COUNT(B.vorgangsnummer) AS Anzahl,
A.Auftragguid,
B.Firmenname,
B.kundenguid,
C.kundennummer
FROM Positionen AS A
LEFT JOIN Vorgang AS B ON A.auftragguid = B.guid
LEFT JOIN Kunden AS C ON B.kundenguid = C.guid
WHERE B.Fakturiert <> 0
AND B.vorgangstype in (4,5,6)
AND B.FakturiertAm between '2025-01-01' AND '2025-01-31'
GROUP BY
C.guid -- Bei Left Join auf Kunden heißt das, dass es nicht zwingend eine C.guid geben muss,
-- diese also im Ergebnis Null sein kann und alle Sätze ohne Kunden werden dann summiert.
-- Ist das gewollt?
-- Mir scheint das zum Gruppieren nicht zwingend geeignet / sinnvoll.
-- Außerdem scheinen hier noch ein paar Spalten im Group by zu fehlen.
-- Alles, was nicht aggregiert wird, muss eigentlich ins Group by.
-- Ist das bei MariaDB anders?
ORDER BY
1 DESC;
Kann es Positionen geben, zu denen es entweder keinen Vorgang oder keinen Kunden oder weder Vorgang noch Kunden geben kann?
Wenn nein, dann ist der Left-Join hier fehlt am Platz.
Nachfolgend eine Idee, bei der ich nicht davon ausgehe, dass sie auf Anhieb funktioniert. Schreibfehler, Syntaxfehler, Denkfehler ... nicht ausgeschlossen
SQL-Code:
SELECT
SUM(Netto) AS Netto,
SUM(MwSt) AS MwSt,
SUM(Brutto) AS Brutto,
SUM(Anzahl) AS Anzahl,
Firmenname,
kundenguid,
kundennummer
from (
SELECT
SUM(A.Netto) AS Netto,
SUM(A.MwSt) AS MwSt,
SUM(A.Brutto) AS Brutto,
1 AS Anzahl, -- Hier sollte es pro Vorgang einen Satz geben.
B.GUID,
B.Firmenname,
B.kundenguid,
C.kundennummer
FROM Positionen AS A
LEFT JOIN Vorgang AS B ON A.auftragguid = B.guid
LEFT JOIN Kunden AS C ON B.kundenguid = C.guid
WHERE B.Fakturiert <> 0
AND B.vorgangstype in (4,5,6)
AND B.FakturiertAm between '2025-01-01' AND '2025-01-31'
GROUP BY
B.GUID,
B.Firmenname,
B.Kundenguid,
C.Kundennummer
) X
GROUP BY
Firmenname,
Kundenguid,
Kundennummer
ORDER BY
1 DESC, -- Und was ist, wenn es mehrere, identische Nettobeträge gibt?
-- Reihenfolge dann zufällig?
5; -- Firmenname
|