Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem mit Group by in Access (https://www.delphipraxis.net/200783-problem-mit-group-access.html)

Delphi.Narium 24. Mai 2019 18:08

AW: Problem mit Group by in Access
 
Ausgangs-SQL:
SQL-Code:
SELECT
  Materialrollen.[Mat-Nr],
  Materialrollen.Rollennummer,
  Materialrollen.DatumAb,
  Rollenlager.Lagerplatz,
  Rollenlager.Rollennummer
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
Zitat:

Ich möchte jedoch nur die Lagerplätze anzeigen lassen, ...
SQL-Code:
SELECT
  Rollenlager.Lagerplatz
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
Zitat:

jedoch gruppiert.
SQL-Code:
SELECT
  Rollenlager.Lagerplatz
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
group by
  Rollenlager.Lagerplatz
Zitat:

Wenn mehrere Artikel auf einem Platz liegen, dann brauche ich nur einmal diesen Platzangezeigt.
Einfachste Methode das zu erreichen:

Was nicht gebraucht wird, wird auch nicht ausgegeben, dann stört es auch nicht im Group by und "verstrubbelt" damit auch nicht das Ergebnis. ;-)

Und:

Nicht alles, was in der Wherebedingung benötigt wird, muss auch im Select aufgeführt werden, dort wird nur das aufgeführt, was in der Ausgabe tatsächlich benötigt wird.

Alles was im Ergebnis benötigt wird, also zwischen Select und from steht, muss auch im Group by berücksichtigt werden, sofern es nicht über eine Aggregatfunktion verarbeitet wird, sei es nun Min oder Max oder Avg oder ...

Dashier ginge z. B.:
SQL-Code:
SELECT
  Count(*) as Anzahl,
  Rollenlager.Lagerplatz
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
group by
  Rollenlager.Lagerplatz
Wir erfahren damit nicht nur, welche Lagerplätze von der Where-Bedingung betroffen sind, sondern auch, wie oft jeder Lagerplatz betroffen / belegt ... was auch immer ist,

Oder dashier, was zu einem "erweiteren" Ergebnis führt und einem mehrfachen Aufführen des Lagerplatzes:
SQL-Code:
SELECT
  Count(*) as Anzahl,
  Rollenlager.Lagerplatz,
  Materialrollen.[Mat-Nr]
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
group by
  Rollenlager.Lagerplatz,
  Materialrollen.[Mat-Nr]
Hiermit erfahren wir, wieviele Exemplare jeder gefundenenen Mat-Nr auf einem Lagerplatz liegen. Das heißt: Was zusätzlich im Select erscheint und nicht über eine Aggregatfunktion "gebündelt / zusammengefasst " wird, muss auch zwingend im Group by erscheinen.

Wenn eventuell für das praktische Leben auch sinnfrei:
SQL-Code:
SELECT
  Count(*) as Anzahl,
  Rollenlager.Lagerplatz,
  Max(Materialrollen.[Mat-Nr]) as MatNr
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and  Materialrollen.DatumAb is NULL
group by
  Rollenlager.Lagerplatz
Hier erfahen wir, wie oft ein Lagerplatz betroffen ist und die höchste dort vorzufindende Matrialnummer.

p80286 24. Mai 2019 20:09

AW: Problem mit Group by in Access
 
Eine weitere Möglichkeit wäre
SQL-Code:
SELECT distinct
  Rollenlager.Lagerplatz
FROM Materialrollen
LEFT JOIN Rollenlager
  ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where Materialrollen.[Mat-Nr] = :MatNr
and Materialrollen.DatumAb is NULL
Da kommt dann jeder Lagerplatz der mindestens einmal genutzt wird einmal zurück.

Gruß
K-H

Luckner 24. Mai 2019 21:09

AW: Problem mit Group by in Access
 
Hallo p80286,

danke, dass Du versuchst mir zu helfen. Habe, anhand Deines Beispiels (3. von oben) versucht das umzusetzen, bekomme jedoch eine Fehlermeldung: "Syntaxfehler, fehlender Operator usw."

Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('SELECT DISTINCTROW Rollenlager.Lagerplatz LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where ((Materialrollen.[Mat-Nr] = '+ EditMaterialeingangMatNr.Text + ') and Materialrollen.DatumAb is NULL))');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add(' group by Rollenlager.Lagerplatz');
Gruß, Luckner

jobo 24. Mai 2019 22:17

AW: Problem mit Group by in Access
 
Es fehlt "from <gewünschteTabelle>" vor dem Abschnit "LEFT JOIN Rollenlager"
also wahrscheinlich
"from Materialrollen"

Kann es sein, dass es hier irgendwelche Missverständnisse gibt?
Wie wär es wenn Du mal eine Beispielliste mit den Daten machst, die Du ohne group by hast und wie es mit group by aussehen soll?!

Luckner 25. Mai 2019 08:39

AW: Problem mit Group by in Access
 
Hallo jobo,

es war doch etwas spät gestern abend und ich hab es übersehen. Jetzt folgende select-Anweisung;

Delphi-Quellcode:
         Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('SELECT DISTINCTROW Rollenlager.Lagerplatz FROM Materialrollen LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where (Materialrollen.[Mat-Nr] = '+ EditMaterialeingangMatNr.Text + ' and Materialrollen.DatumAb is NULL)');
         Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add(' group by Rollenlager.Lagerplatz');
jedoch eine Fehlermeldung: "Das Feld Mat-Nr wurde nicht gefunden". Es sieht so aus, als ob doch keine Einträge weg bleiben können.

Meine Absicht ist:

Es gibt 2 Tabellen in einer Access-Datenbank (ist schon seit Jahren aktiv und kann z.Zt. nicht geändert werden.): Tabelle 1: Materialrollen. in dieser Tabelle sind folgende Felder:
[Mat-Nr], [Rollennummer}, [DatumAb]. Es gibt da noch einige Felder mehr, sind jedoch hier nicht wichtig. Dann 2. Tabelle: [Rollennummer] und [Lagerplatz]. Wenn in der Tabelle 1 im Feld "DatumAb ein Eintrag vorhanden ist, dann ist in Tabelle 2 kein Datensatz mehr. Möchte jetzt über die "Materialrollen.[Mat-Nr]" alle Lagerplätze der Rollennummern herausfinden. Wobei nicht aufgelistet Rollennummer = Lagerplatz, sondern nur Lagerplatz. Wenn alle Materialrollen auf einem Lagerplatz liegt, dann nur eine Zahl z.Bsp. B103.

Ohne "Group By" zeigt mir die Tabelle 50 Rollen auf dem gleichen Platz und einige andere Rollen auf anderen Plätzen. Eine Rolle kann natürlich aus Platzmangel auch auf einem anderem Platz liegen. Das müsste man auch sehen. Es geht nur um eine Übersicht, welche Plätze werden für ein bestimmtes Material belegt.

Ich hoffe, ich konnte mich verständlich machen.

Danke, Luckner

Delphi.Narium 25. Mai 2019 09:52

AW: Problem mit Group by in Access
 
Zitat:

Zitat von jobo (Beitrag 1433100)
Wie wär es wenn Du mal eine Beispielliste mit den Daten machst, die Du ohne group by hast und wie es mit group by aussehen soll?!

Ich habe immernochnicht verstanden, was Du genau willst, bzw. wenn ich es doch verstanden haben sollte, sind passende Abfragen hier im Thread bereits vorhanden.

Um den Test und die Entwicklung des passenden SQLs zu vereinfachen, solltest Du diese zuerst mal in Access testen und dann später in den Delphiquelltext übernehmen. Fehler sind so deutlich einfacher zu finden und statt "ellenlange" SQLs per + Edit.text + zusammenzubauen, eventuell Parameter verwenden, auch das macht die SQLs deutlich übersichtlicher und leichter les- und testbar.

Group by gruppiert Datensätze so, das sie eindeutig werden.
Distinct (Accress DistinctRow?) gruppiert Datensätze so, das sie eindeutig werden.

Das ist doppeltgemoppelt und zeigt, wenn es tatsächlich erforderlich sein sollte, dass die Abfrage fehlerhaft ist.

Wenn ich mit Group By etwas eindeutig mache und das Eindeutige anschließend per Distinct eindeutig machen muss, dann passt da was nicht.
SQL-Code:
SELECT Rollenlager.Lagerplatz FROM Materialrollen
LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where (Materialrollen.[Mat-Nr] = :MatNr
   and Materialrollen.DatumAb is NULL)
group by Rollenlager.Lagerplatz

jobo 25. Mai 2019 10:40

AW: Problem mit Group by in Access
 
Irgendwie geht's nicht weiter.
@Luckner: Deine Beschreibungen sind sicher gut gemeint, aber es gibt tatsächlich einige Varianten, die man mit den gegebenen Feldern und Group By und Aggregaten produzieren könnte.

Das Ganze in Delphi Code eingekleidet macht es nicht übersichtlicher. Dieser Hinweis von Delphi.Narium ist auch wertvoll. Das pure SQL kannst Du direkt life in Access ausprobieren. Access bietet für die Abfragen den Klickermodus und den SQL Editor. (Zumindest ging das früher in Access, ich geh davon aus, es wurde nicht weg"optimiert")


Vorschlag:
Mach eine Access Abfrage der ungruppierten Daten und kopier ein paar Sätze hier ins Forum als Ausgangsdaten.
Diese Sätze editierst Du dann so um, dass sie deiner Zielvorstellung entsprechen und postest sie auch.

Distinct:
Schlimmstenfalls ist das tatsächlich doppelt gemoppelt, tut aber allermeistens nicht weh, auch wenn es praktisch möglich ist, dass ein Distinct das Ergebnis eines Group by verändert(zerstört).

Luckner 25. Mai 2019 10:45

AW: Problem mit Group by in Access
 
Hallo jobo,
DistinctRow habe ich rausgenommen. Fehler identisch. Ich glaube, ich muss mit einem Access-Programmierer reden. Habe schnell unter Firebird diese 2 Tabellen nachgebildet und da gibt es keine Fehlermeldung. Aber ich werde das Ergebnis der Abfrage ohne Group By und dann meine Vorstellung hier posten.

Gruß, Luckner

Luckner 25. Mai 2019 10:52

AW: Problem mit Group by in Access
 
Als Ergebnis bekomme ich:
[Lagerplatz]
P001
P007
P014
P014
P014
P014
P014
P015

Haben möchte ich:
[Lagerplatz]
P001
P007
P014
P015

Luckner

Delphi.Narium 25. Mai 2019 11:17

AW: Problem mit Group by in Access
 
Bitte noch das reine SQL zu dem "Als Ergebnis bekomme ich: "

Eigentlich sollte da ein reines Group by Lagerplatz am Ende reichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 Uhr.
Seite 3 von 5     123 45      

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