Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Hilfe bei SQL (https://www.delphipraxis.net/169676-hilfe-bei-sql.html)

Metallicwar 4. Aug 2012 11:00

Datenbank: ADS • Version: 10 • Zugriff über: Delphi

Hilfe bei SQL
 
Hi hänge grad bei einem SQL
Hier erstmal der SQL:
Dieser liefert mir bisher alle gebuchten Aufträge eines Mitarbeits zurück.
SQL-Code:
SELECT
    Auftrag.Nummer, Auftrag.Bezeichnung,
    Buchungen.BSumme,
    ZMIF.MinToHour(Buchungen.BSumme) as StdMin,
    ZMIF.MinToIHour(Buchungen.BSumme) as Dez,
    Personal.Name, Personal.Vorname, Personal.ID,
    (SELECT Min(Datum) FROM Buchungen) AS DatumVon,
    (SELECT Max(Datum) FROM Buchungen) AS DatumBis
FROM
    Auftrag
        LEFT OUTER JOIN Buchungen ON Auftrag.Nummer = Buchungen.AuftragNr
            LEFT OUTER JOIN Personal Personal ON Buchungen.ID_Personal = Personal.ID
WHERE
    Buchungen.ID IS NOT NULL AND
    Buchungen.Datum >= '01.01.2011' AND Buchungen.Datum <= '01.08.2012'
ORDER BY
    Name, Vorname, Auftrag.Nummer;
Ich möchte das Ergebnis noch gruppieren. Es kann nämlich auch sein, dass ein Mitarbeiter mehrmals den selben Auftrag anbucht.
So siehts bisher aus:

Zitat:

Auftragnr|Buchungssumme|Name
123|120|Mustermann
123|60|Mustermann
123|300|Mustermann
555|60|Mustermann
555|120|Mustermann
555|240|Müller
666|60|Marx
666|240|Marx
Ich möchte:
Zitat:

Auftragnr|Buchungssumme|Name
123|480|Mustermann
555|180|Mustermann
555|240|Müller
666|300|Marx
müsste doch nur noch ein group by sein oder und eine sum funktion oder?

mkinzler 4. Aug 2012 11:13

AW: Hilfe bei SQL
 
Am einfachsten deine Abfarge als Derived Table weiter Gruppieren:

SQL-Code:
select
   AuftragNr,
   sum( Buchungssumme), name
from
   <Deine Abfrage>
group by
    AuftragNr, Name;

DeddyH 4. Aug 2012 11:18

AW: Hilfe bei SQL
 
Haut das hier hin?
SQL-Code:
SELECT
  A.Nummer AS Auftragnr,
  SUM(B.BSumme) AS Buchungssumme,
  P.Name AS Name
FROM
  Auftrag A
LEFT JOIN
  Buchungen B ON B.AuftragNr = A.Nummer
LEFT JOIN
  Personal P ON P.ID = B.ID_Personal
WHERE
  B.ID IS NOT NULL
AND
  B.Datum BETWEEN '01.01.2011' AND '01.08.2012'
GROUP BY
  A.Nummer, P.Name
ORDER BY
  A.Nummer, P.Name

Metallicwar 4. Aug 2012 11:41

AW: Hilfe bei SQL
 
super, das wars, besten dank und ein schönes Wochenende !!

omata 4. Aug 2012 22:58

AW: Hilfe bei SQL
 
Fragt sich nur noch, warum das Outer-Joins sind?
SQL-Code:
SELECT A.Nummer AS Auftragnr,
       SUM(B.BSumme) AS Buchungssumme,
       P.Name AS Name
FROM Auftrag A
INNER JOIN Buchungen B
  ON A.Nummer = B.AuftragNr
INNER JOIN Personal P
  ON B.ID_Personal = P.ID
WHERE B.Datum BETWEEN '01.01.2011' AND '01.08.2012'
GROUP BY A.Nummer, P.Name
ORDER BY A.Nummer, P.Name
Da B in der Where-Klausel und P in der Group-By-Klausel auftritt, können nur Zeilen im Ergebnis vorkommen, die in allen drei Tabellen vorkommen. Und das ist dann automatisch jeweils ein Inner-Join.

Edit: und dann auch noch B.ID IS NOT NULL. Wenn ID in B der PK ist, dann ist das ein Inner-Join.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz