1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL Abfrage DB2

Dieses Thema im Forum "DB2" wurde erstellt von MorningStar, 6 November 2016.

  1. MorningStar

    MorningStar Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. MorningStar

    MorningStar Neuer Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. MorningStar

    MorningStar Neuer Benutzer

    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 :/
     
    akretschmer gefällt das.
Die Seite wird geladen...
Ähnliche Themen
  1. davzin
    Antworten:
    5
    Aufrufe:
    1.405

Diese Seite empfehlen