Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: Count in SQL mit Left Join

  Alt 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-01AND '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-01AND '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
  Mit Zitat antworten Zitat