Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Sa 28.12.13 01:56 
Hallo zusammen,

ich habe mal eine Frage bezüglich SQL abfragen. Und zwar habe ich folgende Situation.

Ich habe drei Tabellen: Person, Meter und Mannschaft.

In Person gibt es die Felder: Nummer, Vorname, Nachname, Mannschaft (als Index)
In Meter gibt es: Nummer, Personindex und Meter
In Mannschaft gibt es: Nummer und Mannschaftsname

So jetzt möchte ich eine SQL abfrage starten, die in Meter die gleichen Personenindex erkennt und deren Summe von Meter zurückgibt.
Anschließen möchte ich die Summe der Meter und den Mannschaftsnamen einer Person zuordnen, so dass mein fertig Tabelle ungefähr den Aufbau hat.

Person.Nummer, Nachname, Vorname, Mannschaftsname (als Text), Summe(Meter), ideal wäre noch Meter der gesamten zugehörigen Mannschaft

Ich habe auch schon mehrere Varianten ausprobiert bin aber zu keinem richtigen Ergebnis gekommen.

Eine Variante wäre:

ausblenden SQL-Anweisung
1:
SELECT Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName, sum(Meter.Meter) Meter FROM Person, Meter, Mannschaft WHERE (Person.Nummer=Meter.Personindex) and (Person.Mannschaft = Mannschaft.Nummer) GROUP BY Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName ORDER BY Meter DESC					


Dabei ist das Problem, dass immer nur ein Teilnehmer pro Mannschaft ausgegeben wird.

Eine andere Variante wäre:

ausblenden SQL-Anweisung
1:
Select t2.mName Mannschaftsname, t1.nachname Nachname, t1.vorname Vorname, t3.Strecke Strecke From Person t1, Mannschaft t2, (SELECT T1.Nummer Nummer, SUM(T2.Meter) Strecke FROM Person T1, Meter T2 where T1.Nummer=T2.Personindex group by T1.Nummer order by Strecke DESC) T3 where t1.mannschaft=t2.Nummer and t2.nummer=t3.Nummer group by t2.mname, Nachname, Vorname, Strecke order by Mannschaftsname					


Dabei ist das Problem, dass die zugeordneten Summen der Meter nicht stimmen (und ich weiß nicht warum).

Als Datenbank benutze ich die embedded Variante der NexusDB. Compiler ist Delphi XE5 auf einem Windows 7 Rechner.

Hoffe mir kann jemand weiter helfen.

Gruß,
Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 28.12.13 03:28 
Moin!

Mal ins Blaue getippert (und in MySQL-Syntax, falls das eine Rolle spielen sollte): ;)
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
SELECT
  Person.Nummer, Person.Vorname, Person.Nachname,
  Mannschaft.Mannschaftsname,
  SUM(Meter.Meter)
FROM Person
  LEFT JOIN Meter ON Person.Nummer = Meter.Personindex
  LEFT JOIN Mannschaft ON Person.Mannschaft = Mannschaft.Nummer
GROUP BY Person.Nummer

Das mit den Mannschaftsergebnissen würde ich in einer eigenen Query laufen lassen. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: jackle32
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Sa 28.12.13 11:01 
Ungetestet und ohne Mannschaftssumme (die könnte man per UNION ggf. aber noch dazupfriemeln):
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
SELECT
  P.Nummer,
  P.Nachname,
  P.Vorname,
  MA.Name,
  M.Meter
FROM
  Person P
LEFT JOIN
  Mannschaft MA ON MA.Nummer = P.Mannschaft
LEFT JOIN
  (SELECT 
     SUM(Meter) AS Meter
   FROM
     Meter
   WHERE 
     Meter.Personindex = P.Nummer) M

Falls das klappt, kann man mal weitersehen ;)
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Sa 28.12.13 15:07 
Hallo und danke für die Antworten,

der Ansatz von Narses hat mich auf die Richtige Spur gebracht. Meine jetzt Lösung sieht so aus:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
SELECT
  Person.Nummer, Person.Vorname, Person.Nachname,
  Mannschaft.MName,
  SUM(Meter.Meter)
FROM Person
  LEFT JOIN Meter ON Person.Nummer = Meter.Personindex
  LEFT JOIN Mannschaft ON Person.Mannschaft = Mannschaft.Nummer
GROUP BY Person.Nummer, Person.Vorname, Person.Nachname, Mannschaft.MName


Hab dazu aber noch ne Frage und zwar ist bei den anderen Lösungen in GROUP BY nur "Person.Nummer" aufgeführt. Wenn ich das aber so stehen lasse, kommt immer die Fehlermeldung:

ausblenden Quelltext
1:
2:
NexusDB: Query2613049335: Query execution failed: 
Error in statement: Column references must either be in aggregate functions or grouped on: "Person.Vorname"


Kann mir jemand erklären warum?

Gruß,
Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 28.12.13 18:36 
Moin!

user profile iconjackle32 hat folgendes geschrieben Zum zitierten Posting springen:
Hab dazu aber noch ne Frage und zwar ist bei den anderen Lösungen in GROUP BY nur "Person.Nummer" aufgeführt. Wenn ich das aber so stehen lasse, kommt immer die Fehlermeldung:

ausblenden Quelltext
1:
2:
NexusDB: Query2613049335: Query execution failed: 
Error in statement: Column references must either be in aggregate functions or grouped on: "Person.Vorname"
Weil dein (R?)DBMS ähnlich wie MS Access darauf besteht (unflexiblerweise, allerdings, das ärgert mich jedesmal bei dem blöden Access), dass alle Spalten der Ergebnismenge beim Gruppieren explizit gruppiert oder aggregiert werden müssen. :nixweiss: Dagegen kann man so nix machen, höchstens eine andere DB nehmen. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.