SQL Beispiele 1-20

  • Zitat

    Original geschrieben von gst
    die (hoffentlich richtigen ;) loesungen zu den beispielen 1-20:


    16) SELECT nachname,vorname FROM (SELECT knr,COUNT(knr) AS entlehnnr FROM ausleihe GROUP BY knr) AS kundenentlehn, kunde WHERE entlehnnr >=2 AND kunde.knr = kundenentlehn.knr;


    /gst



    ...ich glaub 7 kunden mit mehr od. gleich 10 entlehnungen ist doch zu viel...oder? ....wenn ich mir alle tupel bei ausleihe so ansehe und ich auf die kundennummer schau, können es meiner meinung nach nur 2 kunden sein!

  • Hi, glaub ich hab eine recht gute Lösung für 16:


    select Nachname, Vorname
    from Kunde
    where KNr in
    (select KNr
    from Ausleihe
    Group by KNr
    having count(Knr)>=10);


    Da kommen mir genau 2 Kunden raus und das sollt eigentlich stimmen!

  • Ist zwar vielleicht etwas verwirrend, gibt aber glaub ich das richtige aus!


    select Nachname, Vorname
    from Autor A, Exemplar E
    where A.ISBN = E.ISBN and InvNr in
    (select Invnr
    from Ausleihe
    Group by InvnR
    having count(InvNr) >= all (select count(InvNr)
    from Ausleihe
    Group by InvNr));


    Die Lösung die für Bsp. 17 schon geposted ist, gibt als Anzahl der Entlehnungen 23 aus, die am häufigsten ausgeliehenen Bücher wurden aber nur 6 Mal ausgeliehen, hoffe das das stimmt was ich da von mir gebe, glaub aber schon!

  • könnte so einfach?

    Code
    1. select Vorname , Nachname ,Telefon from kunde K where not
    2. exists((select distinct isbn from autor where vorname='Karl' and
    3. nachname='May')
    4. except
    5. (select distinct E.isbn from ausleihe A, exemplar E , autor Y where
    6. A.invnr=E.invnr and E.isbn=Y.isbn and vorname='Karl' and
    7. nachname='May'));
  • @RS 250 Bsp17


    ich glaub nicht, dass das so passt. Weil der Karl May eindeutig am öftesten augeborgt wurde.
    Was dein Code macht, so weit ich das versteh, is ja für jedes einzelne Exemplar die Anzahl der Entlehnungen berechnen. Aber für eine Autor gibt's ja mehrere Exemplare.


    Ich hab allerdings auch noch keinen Verbesserungsvorschlag.


    lg, Geli

  • Mein Vorschlag zu dem Beispiel wär das hier.



    select RegalNr, count (InvNr)-1 as vorhanden
    from ( select RegalNr, InvNr
    from Exemplar
    where InvNr not in
    ( select InvNr
    from Ausleihe
    where bis = null)


    union


    select RegalNr, 0
    from Exemplar
    ) as R1


    group by RegalNr


    das "union" is drin, weil es ja auch Regale geben Könnt, von denen alle Bücher ausgeborgt worden sind.


    lg, Geli

  • @ BSP10
    ich hab da eine etwas einfachere Query:


    Select Kunde.Nachname, Kunde.Vorname, Kunde.KNr
    From Kunde
    Where Kunde.KNr not in (
    Select A.KNr
    From Ausleihe A, Klassifikation Kl, Exemplar E
    Where A.InvNr = E.InvNr AND E.ISBN = Kl.ISBN AND Kl.Gebiet like '%elletristik' )


    unterschied zu gst ist, dass auch Leute in die Query einbezogen werden, die noch nie ein Buch ausgelieben haben (die haben auch definitiv noch kein belletristisches Buch ausgeliehen)


    muss man eigentlich immer
    ... like '%athematik' usw....
    schreiben statt ganz einfach
    ....= 'Mathematik' ...
    , auch wenn es Einträge mit 'mathematik' gibt (in der Frage wird Mathematik großgeschrieben)


    wie seht ihr das ?

  • könnt das funktionieren???


    select Vorname, Nachname, Telefon
    from Kunde
    where Knr in
    (select KNr
    from Ausleihe
    where InvNr in
    (select InvNr
    from Exemplar
    where ISBN in
    (select ISBN
    from Autor
    where Vorname = 'Karl' and Nachname = 'May'
    )
    )
    )

  • Hallo Leute!


    Ihr setzt SubSelects sehr extensiv ein, was meiner Meinung nach die ganze Sache teilweise unnötig verkompliziert....


    Ich poste mal meine komplette Lösung als Word, bin natürlich für jegliche Art von Kritik offen!


    LG


    Firefox

  • Meine Lösung, die einer bereits geposteten ziemlich ähnlich ist, aber noch ein bissi einfacher:



    oder gibts da einen Haken?

  • Tschuldigung, aber kann mir da irgendwer bei meinem Denkfehler helfen?
    Ich habe als Eingabe nämlich folgendes:


    select distinct B.Titel, K.Knr, K.Vorname, K.Nachname, A.von
    from Buch B, Exemplar E, Ausleihe A, Kunde K
    where A.InvNr=E.InvNr and E.ISBN=B.ISBN and A.KNr=K.KNr and A.von in (select von
    from Ausleihe A
    where bis = null)


    Eigentlich würd ich sagen, dass das nur eine andere verschachtelte Aufforderung von eurem ist, doch es ergibt ein vollkommen anderes Ergebnis.
    Außerdem bleiben bei eurer Eingabe ja auch drei Felder bei von frei - doch das würde doch bedeuten, dieses Buch ist nicht entlehnt.
    Da ich jedoch der Mehrheit vertraue, nehm ich an, ich hab einfach nur nen Denkfehler, wär also nett, wenn mir da wer helfen könnt.

  • Lexsa :
    ich denke das distinct ist falsch


    und wieso brauchst du da überhaupt ein subselect ?
    imho ginge das ganz einfach so:


    Code
    1. select
    2. b.titel, k.knr, k.Nachname, a.von
    3. from
    4. buch b, exemplar e, ausleihe a, kunde k
    5. where
    6. b.isbn=e.isbn and e.invnr=a.invnr and a.bis is null and k.knr=a.knr;


    edit:


    achja, wenn du per von selektierst, kriegst du auch bücher die an tagen ausgeliehen wurden wo andere bücher ausgeliehen wurden, also kriegst du mit deiner abfrage alle bücher die an tagen ausgeliehen wurden wo zumindest ein anderes buch ausgeliehen wurde das bisher noch nicht zurückgegeben wurde


    das ist der fehler !


    peter

  • ich glaube bei den lösungen für bsp. 5 die bisher gepostet wurden is noch ein denkfehler.


    es sollen ja die bücher aufgelistet werden, die gerade ausgeborgt sind. das ist genau dann der fall, wenn BIS NULL ist, und VON NOT NULL. Die drei Bücher, bei denen von NULL ist, wurden ja quasi noch nie ausgeborgt. oder?



    ok, ausgeborgt wurden sie eigentlich schon, sonst wüden sie ja nicht in der Ausleihliste stehen. Aber wieso fehlt dann das datum bei "von"?