Entwickler-Ecke
Datenbanken - Mehrere UNION und ein GROUP BY-> Syntax
Laaeris - Do 30.12.10 13:05
Titel: Mehrere UNION und ein GROUP BY-> Syntax
Hallo zusammen,
trotz intensiver Suche und Ausprobiererei finde ich keine Lösung für die folgende Aufgabe:
Ich habe vier Tabellen, die eine Menge enthalten, welche ich summieren muss. Dazu muss ich prinzipiell zweistufig Gruppieren.
Erst in der jeweiligen Tabelle selbst die Zeilen aufsummieren und anschließend die Summen erneut summieren.
Ersteres funktioniert, letzteres jedoch nicht - zumindest ist mir noch keine vom Delphi 7/BDE akzeptierte Syntax eingefallen.
Der Code sieht derzeit so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| DataModul.StatistikRohstoffSummenQuery.SQL.add('select Rohstoff, sum(menge)'); DataModul.StatistikRohstoffSummenQuery.SQL.add('FROM (select DISTINCT rl.ROHSTOFF ROHSTOFF, sum(rl.Menge) Menge'); DataModul.StatistikRohstoffSummenQuery.SQL.add('from Rohstofflager rl, Planetenatlas pa'); DataModul.StatistikRohstoffSummenQuery.SQL.add('WHERE rl.ORT=pa.NAME'); DataModul.StatistikRohstoffSummenQuery.SQL.add('AND pa.BESITZER='+CHR(39)+Aktiv_Spieler+CHR(39)); DataModul.StatistikRohstoffSummenQuery.SQL.add('group by rl.Rohstoff'); DataModul.StatistikRohstoffSummenQuery.SQL.add('UNION'); DataModul.StatistikRohstoffSummenQuery.SQL.add('select DISTINCT rl.ROHSTOFF, sum(rl.Menge) Menge'); DataModul.StatistikRohstoffSummenQuery.SQL.add('from Rohstofflager rl, SSTabelle ss'); DataModul.StatistikRohstoffSummenQuery.SQL.add('WHERE rl.ORT=ss.NAME'); DataModul.StatistikRohstoffSummenQuery.SQL.add('AND ss.BESITZER='+CHR(39)+Aktiv_Spieler+CHR(39)); DataModul.StatistikRohstoffSummenQuery.SQL.add('group by rl.Rohstoff'); DataModul.StatistikRohstoffSummenQuery.SQL.add('UNION'); DataModul.StatistikRohstoffSummenQuery.SQL.add('select DISTINCT rl.ROHSTOFF, sum(rl.Menge) Menge'); DataModul.StatistikRohstoffSummenQuery.SQL.add('from Rohstofflager rl, LSTabelle ls'); DataModul.StatistikRohstoffSummenQuery.SQL.add('WHERE rl.ORT=ls.NAME'); DataModul.StatistikRohstoffSummenQuery.SQL.add('AND ls.BESITZER='+CHR(39)+Aktiv_Spieler+CHR(39)); DataModul.StatistikRohstoffSummenQuery.SQL.add('group by rl.Rohstoff'); DataModul.StatistikRohstoffSummenQuery.SQL.add('UNION'); DataModul.StatistikRohstoffSummenQuery.SQL.add('select DISTINCT rl.ROHSTOFF, sum(rl.Menge) Menge'); DataModul.StatistikRohstoffSummenQuery.SQL.add('from Rohstofflager rl, Station st'); DataModul.StatistikRohstoffSummenQuery.SQL.add('WHERE rl.ORT=st.NAME'); DataModul.StatistikRohstoffSummenQuery.SQL.add('AND st.BESITZER='+CHR(39)+Aktiv_Spieler+CHR(39)); DataModul.StatistikRohstoffSummenQuery.SQL.add('group by rl.Rohstoff'); DataModul.StatistikRohstoffSummenQuery.SQL.add(')'); DataModul.StatistikRohstoffSummenQuery.SQL.add('GROUP BY ROHSTOFF'); DataModul.StatistikRohstoffSummenQuery.SQL.add('ORDER BY Menge DESC'); |
Zur Erklärung der Tabellen:
Die Tabelle Rohstofflager besteht aus den Spalten
ROHSTOFF, MENGE, ORT, ORTTYP
Der Ort ergibt sich aus den vier Tabellen SS, LS, Station und Planet.
Der ORT ist jeweils datenbankweit eindeutig.
Der Besitzer der MENGE ist nicht Teil der Tabelle Rohstofflager, so dass ich über die 4 Unterselects gehen muss, um nur dessen
Lager zu ermitteln (jede der vier Tabellen hat die Form: NAME, BESITZER, ...).
Welche Syntax wäre angebracht?
Die o.a. funktioniert nicht (er akzeptiert das select nach der Klammer nicht). Ich habe so ziemlich jede Syntax ausprobiert, die in meinen Augen gültig ist, leider ohne Erfolg. Und auf dem tagelangen Holzweg lasse ich mir gerne mal einen Tipp geben... :-)
Viele Grüße & schonmal einen Guten Rutsch,
David
jaevencooler - Do 30.12.10 15:15
Moin, Moin,
um Dir helfen zu können, benötigen wir erst einmal die Information um welche Datenbank es sich handelt.
Auch wenn das Problem an sich auch mit ANSI SQL zu lösen ist, kann man unter Umständen Datenbank spezifisch die
Lösung des Problems optimieren.
Soll bedeuten handelt es sich z.B. um eine Access Datenbank :autsch: , muss ich das Problem ganz anders angehen als z.B. bei
mySQL, Oracle, SQL-Server.
Beste Grüße
Michael
Laaeris - Do 30.12.10 17:18
Hallo Michael,
stimmt natürlich.
Ich nutze nur DBASE, Delphi 7, die BDE und die Standardkomponenten von Delphi (TDataBase, TQuery).
Also leider IMHO keine echte Datenbank, da ich keine echten Relationen technisch absichern kann, aber privat geht's derzeit nicht anders (das Projekt ist >10 Jahre alt, da ist ein Umbau unschön). Die Datenbank ist von der Struktur aber schon nahezu vollrelational.
Die Tabellen wurden damals mit dem Database Desktop erstellt, mit dem Typ dbase for Windows (glaube aber nicht, dass das relevant ist).
Ergibt sich daraus die SQL-Syntax?
Viele Grüße
David
Tankard - Do 30.12.10 17:39
SQL-Anweisung
1:
| select DISTINCT rl.ROHSTOFF ROHSTOFF, sum(rl.Menge) Menge ...... |
sollte das nicht schon eher so lauten :
SQL-Anweisung
1:
| select DISTINCT rl.ROHSTOFF ROHSTOFF, sum(rl.Menge) as Menge ...... |
hab mir das ganze jetzt aber nicht wirklich angeschaut. mir fiel nur auf du die summe von r.menge gerne mit dem namen menge ausgegeben haben moechtest, damit du die ergebnisse hinterher wieder mit
sum(Menge) aufsummieren kannst.
gruss
tankard
Laaeris - Do 30.12.10 19:05
... der Alias MENGE wir bei mir auch ohne as erkannt - zumindest syntaktisch.
Ich bekomme das richtige aus den Subselects zurück, nur halt pro ROHSTOFF eine Zeile mit Menge (die pro Subselect auch richtig aufsummiert werden).
Das Summieren der bis zu vier Zeilen (für die vier Tabellen, nicht in jeder muss der entsprechende Rohstoff vorkommen) jedoch klappt nicht - ich habe keine Idee, wie das syntaktisch richtig ist, meine Ideen gehen alle nicht.
Habe übrigens eben gesehen, dass das DISTINCT meiner Meinung nach überflüssig ist.
Viele Grüße
David
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!