SQL Abfrage DB2

MorningStar

Neuer Benutzer
Beiträge
3
Hi zusammen,

ich muss für die Uni folgende SQL Abfrage für DB2 realisieren: Geben sie alle Verlage aus, die Bücher in jeweils allen Jahren von 1995 bis 2001 verlegt habe, vorausgesetzt, dass in diesen Jahren überhaupt Bücher verlegt worden sind.

Tabellen
buch ( buchid, titel, jahr, verlagsid)
verlag(verlagsid, name, ort)

Normalerweise würde ich jetzt einfach für jeden Verlag bestimmen, ob er in einem Jahr ein Buch heraus gebracht hat mit :

SELECT v.name
FROM verlag v
WHERE v.verlagsid in (

SELECT *
FROM buch
WHERE buch.verlagsid = v.verlagsid AND jahr = xxxx


)

UND dann würde ich für alle 6 Jahre den Durchschnitt mit INTERSECT bilden. Der Nebensatz in der Aufgabe verhagelt mir hier aber die show. Da die Menge für das jahr 2000 leer ist, ist auch mein Durchschnitt leer. Die Frage ist also, wie beziehe ich die Bedingung, dass in dem Jahr überhaupt Bücher herausgebracht wurden, mit ein.

Eine erste Idee war Folgende: Ich ziehe mir die Jahre aus der Tabelle buch mit BETWEEN 1995 AND 2001 und bestimme dann für jedes Jahr die Menge an Büchern. Dann schaue ich, ob ein Verlag in allen Mengen mindestens 1 Buch hat. Allerdings habe ich keine Ahnung, wie ich das in SQL umsetzte.

Ich hoffe, jemand von euch kann mir helfen :)
Vielen Dank
Morni
 
Werbung:
das geht einfacher:

Code:
test=*# select * from buch;
 id | verlag | titel | jahr
----+--------+-------+------
  1 |  1 | 2000  | 2000
  2 |  2 | 1994  | 1994
  3 |  2 | 1995  | 1995
  4 |  2 | 1996  | 1996
  5 |  2 | 1997  | 1997
  6 |  2 | 1998  | 1998
  7 |  2 | 1999  | 1999
  8 |  2 | 2000  | 2000
  9 |  2 | 2001  | 2001
 10 |  2 | 1998  | 2000
(10 Zeilen)

test=*# select verlag, count(distinct jahr) from buch where jahr between 1995 and 2001 group by verlag having count(distinct jahr) = 7;
 verlag | count
--------+-------
  2 |  7
(1 Zeile)

PostgreSQL, könnte aber auch mit Deiner DB gehen.
 
Dann laufe ich, zumindest soweit ich das sehe, vor die gleiche Wand. Ich weiß ja nicht, in welchem Jahr keine Bücher herausgebracht wurden. Wenn ich die Menge der Elemente, also 7, als festen Vergleichswert nehme, unterstelle ich, dass in jedem Jahr mindestens ein Buch herausgegeben wurde.
 
Nun ja:

Code:
test=*# select * from buch;
 id | verlag | titel | jahr
----+--------+-------+------
  1 |  1 | 2000  | 2000
  2 |  2 | 1994  | 1994
  3 |  2 | 1995  | 1995
  4 |  2 | 1996  | 1996
  5 |  2 | 1997  | 1997
  6 |  2 | 1998  | 1998
  8 |  2 | 2000  | 2000
  9 |  2 | 2001  | 2001
 10 |  2 | 1998  | 2000
(9 Zeilen)

test=*# select verlag, count(distinct jahr) from buch where jahr between 1995 and 2001 group by verlag having count(distinct jahr) = (select count(distinct jahr) from buch where jahr between 1995 and 2001);;
 verlag | count
--------+-------
  2 |  6
(1 Zeile)

test=*#

kein Buch in 1999.
 
Werbung:
Hi,

ich hab deine Anfrage nochmal nachgebildet und eine relativ einfache Lösung für mein Problem gefunden.

SELECT v.name
FROM verlag v
JOIN buch b
ON v.verlagsid = b.verlagsid
WHERE (jahr BETWEEN 1995 AND 2001)
GROUP BY v.name

HAVING count(distinct b.jahr) = (

SELECT count(distinct jahr)
FROM Buch
WHERE jahr BETWEEN 1995 AND 2001
)

Da ich die Jahreszahlen aus der Tabelle Buch nehme, tauchen die Jahreszahlen, in denen kein Buch veröffentlicht wurde, erst gar nicht auf.

Dein Ansatz hat mir wirklich geholfen,
Vielen Dank

EDIT: Ich hab vergessen nach rechts zu scrollen :/
 
Zurück
Oben