AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Count in SQL mit Left Join

Ein Thema von Hobbycoder · begonnen am 23. Jan 2025 · letzter Beitrag vom 24. Jan 2025
 
Delphi.Narium

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

AW: Count in SQL mit Left Join

  Alt 23. Jan 2025, 23: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz