Halt mal wieder 'ne SQL-Frage

Hallo allerseits,

hab 'ne Datenbank mit folgenden drei Tabellen (sorry, das Beispiel ist bissi an 'n Haaren herbeigezogen):

Tabelle „Sportler“ (PK ist Sporler_Nr):

Sportler\_Nr | Name
-------------------------
 1 | Sportler1
 2 | Sportler2

Tabelle „Turniere“ (PK ist Sporler_Nr, Jahr):

Sportler\_Nr | Jahr | Anzahl\_Medaillen
--------------------------------------
 1 | 2002 | 10
 1 | 2003 | 8
 2 | 2002 | 3

Tabelle „Medaillen“ (PK ist Sporler_Nr, Jahr):

Sportler\_Nr | Jahr | Anzahl\_Medaillen
--------------------------------------
 1 | 2002 | 3
 1 | 2003 | 5
 2 | 2002 | 1

Die Beziehungen sind glaub ich sofort ersichtlich.
Ich möchte jetzt abfragen, an wievielen Turnieren jede® SportlerIn insgesamt teilgenommen hat und wieviele Medaillen sie/er dabei gewonnen hat.

Gewünschtes Ergebnismenge:

Sportler\_Nr | Name | Turniere | Medaillen
-----------------------------------------------
 1 | Sportler1 | 18 | 8
 2 | Sportler2 | 3 | 1

Folgende zwei Abfragen liefern z. B. das gewünschte Ergebnis:

select Sportler.Sportler\_Nr, Name, sum(Anzahl\_Turniere) as Turniere,
(select sum(Anzahl\_Medaillen) from Medaillen where Sportler\_Nr = Sportler.Sportler\_Nr) as Medaillen
from Sportler, Turniere
where Sportler.Sportler\_Nr=Turniere.Sportler\_Nr
group by Sportler.Sportler\_Nr, Name

select Sportler.Sportler\_Nr, Name, sum(Anzahl\_Turniere) as Turnieranzahl, Medaillen
from Sportler, Turniere, (select Sportler\_nr, sum(Anzahl\_Medaillen) as Medaillen from Medaillen group by Sportler\_Nr) as m
where Sportler.Sportler\_Nr=Turniere.Sportler\_Nr and Sportler.Sportler\_Nr = m.Sportler\_Nr
group by Sportler.Sportler\_Nr, Name, Medaillen

Mit Access klappt das z. B. ganz okay so, allerdings benutze ich irgend’ne uralt SQLBase von Gupta und die mag die Subqueries nicht und liefert 'n Syntaxfehler.

Nun also die Frage:
Wie kann ich obige Ergebnismenge erhalten, ohne Subqueries zu benutzen???

Thanx im Voraus

Lala

Hi,

hab 'ne Datenbank mit folgenden drei Tabellen (sorry, das
Beispiel ist bissi an 'n Haaren herbeigezogen):

Ich hoffe, das ist nur ein Beispiel - ansonsten würde ich dir dringend raten, über dein Datenmodell nachzudenken…

Mit Access klappt das z. B. ganz okay so, allerdings benutze
ich irgend’ne uralt SQLBase von Gupta und die mag die
Subqueries nicht und liefert 'n Syntaxfehler.

„Irgend’ne ural SQLBase“ ist nicht besonders informativ. Geht das genauer?

Nun also die Frage:
Wie kann ich obige Ergebnismenge erhalten, ohne Subqueries zu
benutzen???

Viele Wege führen zum Ziel. Wenn man weiß, welche Features das RDBMS untertützt, kann man sie dafür nutzen, oder halt nicht.

Soweit ich mich erinnern kann, war Gupta von ehemaligen Oracle-Mitarbeitern gegründet worden. Die Syntax lehnte sich stark daran. Für meine Oracle 8.1.7.4-Umgebung kann ich dir also folgendes anbieten, in der Hoffnung, daß es auch mit Gupta klappt:

SQL\> select Sportler.Sportler\_Nr,
 Name,
 sum(distinct Anzahl\_Turniere) as Turniere,
 sum(distinct Anzahl\_Medaillen) as Medaillen
 from Sportler, Turniere, Medaillen
 where Sportler.Sportler\_Nr=Turniere.Sportler\_Nr
 and Sportler.Sportler\_Nr=Medaillen.Sportler\_Nr
 group by Sportler.Sportler\_Nr, Name;

SPORTLER\_NR NAME TURNIERE MEDAILLEN
----------- -------------------- ---------- ----------
 1 Sportler1 18 8
 2 Sportler2 3 1

SQL\>

Gruß

J.

Ich hoffe, das ist nur ein Beispiel - ansonsten würde ich dir
dringend raten, über dein Datenmodell nachzudenken…

Nee, keine Sorge … die eigentliche Abfrage bezieht sich auf 'ne WaWi-System und hat nebenbei mit Sport überhaupt garnichts zu tun … ich hab halt nur nach 'nem maximal einfachem Beispiel gesucht und was Sinnvolles wollt mir nicht einfallen…

„Irgend’ne ural SQLBase“ ist nicht besonders informativ. Geht
das genauer?

SQLBase 7.0.1 (50-Clients-Version)

Viele Wege führen zum Ziel. Wenn man weiß, welche Features das
RDBMS untertützt, kann man sie dafür nutzen, oder halt nicht.

Hab vergessen zu sagen: Alles soll mit einer einzigen Select-Abfrage read-only geschehen … Views, Stored Procedures etc. stehen nicht zur Debatte …

Soweit ich mich erinnern kann, war Gupta von ehemaligen
Oracle-Mitarbeitern gegründet worden. Die Syntax lehnte sich
stark daran. Für meine Oracle 8.1.7.4-Umgebung kann ich dir
also folgendes anbieten, in der Hoffnung, daß es auch mit
Gupta klappt:

SQL> select Sportler.Sportler_Nr,
Name,
sum(distinct Anzahl_Turniere) as Turniere,
sum(distinct Anzahl_Medaillen) as Medaillen
from Sportler, Turniere, Medaillen
where Sportler.Sportler_Nr=Turniere.Sportler_Nr
and Sportler.Sportler_Nr=Medaillen.Sportler_Nr
group by Sportler.Sportler_Nr, Name;

SPORTLER_NR NAME TURNIERE MEDAILLEN


1 Sportler1 18 8
2 Sportler2 3 1

Hast schon recht, in meinem tollen Beispiel klappt das zufälligerweise. Aber DESTINCT macht doch meines Wissens nichts anderes, als einfach nur Duplikate zu ignorieren.
Hätte ein Sportler in zwei Jahren zufällig genau die gleiche Anzahl von Turnieren bzw. Medaillen würde mit sum(distinct …) ja wohl zu wenig berücksichtigt.
Zumindest scheint sich dieses SQLBase DISTINCT so zu interpretieren, was aber meiner Meinung doch auch die Norm ist und Oracle handhabt das doch sicher auch nicht anders…

Oder lieg ich da falsch???
Wenn nein: Hast Du mir vielleicht noch 'n anderen Vorschlag???

1000 Dank
Lala

hallo

könnte sein, dass der script da unten funktioniert. betonung liegt auf könnte, kann ihn gerade nicht testen

select s.sportler_nr, sum(t.anzahl_turniere), sum(m.anzahl_medaillen)
from sportler s, turniere t, medaillen m
where s.sportler_nr = t.sportler_nr
and t.sportler_nr = m.sportler_nr(+)
and t.jahr = m.jahr(+)
group by s.sportler_nr

ciao

christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Halt mal wieder 'ne SQL-Frage (Kleine Korrektur)
Sorry … aber die dritte Spalte in der Tabelle „Turniere“ muss natürlich „Anzahl_Turniere“ heißen …

Also:

Tabelle „Turniere“ (PK ist Sporler_Nr, Jahr):

Sportler\_Nr | Jahr | Anzahl\_Turniere
--------------------------------------
 1 | 2002 | 10
 1 | 2003 | 8
 2 | 2002 | 3

Hi Christian…

könnte sein, dass der script da unten funktioniert. betonung
liegt auf könnte, kann ihn gerade nicht testen

Da hast Du absolut recht, Deine Abfrage liefert genau die besagte Ergebnismenge.
Aber leider - ich hoff da ist mir jetzt niemand böse - hab ich das Beipiel echt scheiße gewählt und übersehen, dass man natürich ausnutzen kann, dass in zwei der drei Tabellen das Jahr vorkommt:

Besser wäre z. B. folgende Änderung (angenommen die Sportler können evtl. gleichzeitig für mehrere Vereine antreten):

Tabelle „Turniere“ (PK Sportler_NR, Verein_Nr)

Sportler\_Nr | Verein\_Nr | Anzahl\_Turniere
------------------------------------------
 1 | 1 | 10
 1 | 2 | 8
 2 | 1 | 3

Der Rest der Frage sei gleich (auch wenn das Beispiel jetzt noch unsinniger wird).

Was mach ich dann???

Gruß und Dank
Lala

PS: Die reale Abfrage zielt übrigens dahin, wieviel Umsatz mein Brötchengeber pro Artikel für einen bestimmten Zeitraum gemacht hat, mit gleichzeitiger Angabe des aktuellen Gesamtbestands pro Artikel…
Wohlgemerkt, es gibt mehrere Lager und Gesamtbestand sei die Summe aller Einzel-Lagerbestände…

Tabellen (stark vereinfacht - Primärschlüssel fett):

Artikel ( ArtikelNr , Artikelname)
Lager ( LagerNr , Lagername)
Lagerbestand ( LagerNr , Artikel , Bestand)
Artikelumsatz ( ArtikelNr , Jahr , Monat , Umsatz)

Ich wollt das bloß einfacher ausdrücken, was mir aber offensichtlich nicht wirklich gelungen ist…

also, so auf die schnelle fällt mir da jetzt kein script ein der dir da was halbwegs richtiges abliefert

hast du da die möglichkeit in der sql-base einen view zu erstellen?

christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi …

also, so auf die schnelle fällt mir da jetzt kein script ein
der dir da was halbwegs richtiges abliefert

hast du da die möglichkeit in der sql-base einen view zu
erstellen?

In SQLBase kann man schon Views erstellen und somit die eigentliche Schwierigkeit umgehen … aber ich hätte das gerne mit einer einzigen Abfrage ohne irgendwelche anderen „Hilfsmittel“ hingekriegt.

Inspieriert von Sanchos Vorschlag glaube ich, dass folgende Abfrage okay ist … ich kann es allerdings grad nicht ausprobieren:

select Sportler.Sportler_Nr,
Name,
sum(Anzahl_Turniere)/count(distinct Jahr) as Turniere,
sum(Anzahl_Medaillen)/count(distinct Verein_Nr) as Medaillen
from Sportler, Turniere, Medaillen
where Sportler.Sportler_Nr=Turniere.Sportler_Nr
and Sportler.Sportler_Nr=Medaillen.Sportler_Nr
group by Sportler.Sportler_Nr, Name

Na ja, der Knaller ist die Lösung auch nicht wirklich (angenommen sie tut überhaupt ;o), weil man hier im Gegensatz zu den Subquery-Lösungen das Ganze von den Primärschlüsseln abhängig macht … würde sich die Primärschlüssel von Medaiilen und Turniere auf mehr als 2 Feldern zusammensetzen wäre das schon etwas problematischer bzw. wenn man Outer-Joins verwendet hätte und count(distinct …) 0 werden könnte etc.
Aber das könnte man schon alles irgendwie in Griff kriegen…

Many thanks…

Lala