Autor Beitrag
Laaeris
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP
Delphi 7
BeitragVerfasst: Do 30.12.10 13:05 
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:

ausblenden 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

_________________
Lieber gut machen statt besser wissen.
jaevencooler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 166
Erhaltene Danke: 6

MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
BeitragVerfasst: 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

_________________
Wissen ist Macht, nichts wissen macht auch nichts...
Laaeris Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP
Delphi 7
BeitragVerfasst: 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

_________________
Lieber gut machen statt besser wissen.
Tankard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Administrator
Beiträge: 217
Erhaltene Danke: 96



BeitragVerfasst: Do 30.12.10 17:39 
ausblenden SQL-Anweisung
1:
select DISTINCT rl.ROHSTOFF ROHSTOFF, sum(rl.Menge) Menge ......					


sollte das nicht schon eher so lauten :

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

Win XP
Delphi 7
BeitragVerfasst: 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

_________________
Lieber gut machen statt besser wissen.