Datemod Beispiel 3

  • Quote from frakno

    kann mir jemand mal erklären wie ich Null-Werte durch 0 ersetze


    da steh ich voll auf Leitung



    alles was ich dazu gelesen hab wäre mittels der funktion
    COALESCE



    manual unter:
    http://www.postgresql.org/docs…unctions-conditional.html


    aber warum brauchst du diese?

    Open TU IRC - freier, unzensierter Informationsaustausch - Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum.
    ____________________________________________________

  • Besten Dank an Craft4
    Coalesce ist das was ich brauch :thumb:
    es ist bei Bsp 16 recht hilfreich

    Quote

    :verycool: Erfolg besteht darin, die richtigen Fähigkeiten im richtigen Moment zu haben!

  • Meine Ideen:


    20. Geben Sie alle Musiker aus, die nur Klavier spielen können.


    select vorname, zuname, geburtsdatum
    from person natural join musiker natural join beherrscht
    where beherrscht.name='Klavier' and beherrscht.id not in
    (Select id from beherrscht where name!='Klavier')


    vorname zuname geburtsdatum
    Franz Huber 1975-07-26
    Robert Huber 1947-11-13


    21. Geben Sie alle Musiker aus, die bei Aufnahmen nur Oboe gespielt haben.


    select vorname, zuname, geburtsdatum
    from person natural join musiker inner join spielt on (musiker.id=spielt.idm)
    where instrument='Oboe' and musiker.id not in
    (Select spielt.idm from spielt where spielt.instrument!='Oboe')


    vorname zuname geburtsdatum
    Robert Schmitt 1937-02-04


    22. Geben Sie alle Musiker aus, die bei Aufnahmen nur Fagott gespielt oder noch gar nichts aufgenommen haben.


    select vorname, zuname, geburtsdatum
    from person natural join musiker
    where musiker.id not in
    (Select spielt.idm from spielt where spielt.instrument!='Fagott')


    vorname zuname geburtsdatum
    Franz Oberdorfer 1975-03-24
    Robert Huber 1953-07-16
    Robert Huber 1947-11-13


    23. Geben Sie alle Komponsiten aus, die im Jahr 1987 (mindestens) ein Werk komponiert haben, aber keines im Jahr 1968.


    select vorname, zuname, geburtsdatum
    from person natural join komponist
    where id in
    (
    select id
    from person natural join komponist natural join werk
    where extract(year from komponiert) = 1987
    )
    and id not in
    (
    select id
    from person natural join komponist natural join werk
    where extract(year from komponiert) = 1968
    )


    vorname zuname geburtsdatum
    Peppi Bauer 1957-10-14
    Peppi Bauer 1963-05-17

  • Nochmal zu Beispiel 14:
    Hier gehts ja darum dass die Komponisten aufgelistet werden sollen, die nur TextWerke haben und diese auch nur mit eigenem Text. Die Lösung müsste ja Pepi Bauer 2002 sein. Ich denk ich habs hingekriegt, aber ich frag mich obs nicht vielleicht eine leichtere Lösung gibt *kopfrauch*


    SELECT id, Vorname, Zuname FROM
    (SELECT id, Vorname, Zuname, COUNT(id) FROM Person NATURAL JOIN Werk GROUP BY id, Vorname, Zuname) AS temp1
    NATURAL JOIN
    (SELECT id, COUNT(id) FROM TextWerk WHERE id=texter GROUP BY id) AS temp2;


    Was sagt ihr dazu?

  • ad 15:
    Wenn das mit den vielen SELECTs ok ist würd ichs so machen. Gibts andere Vorschläge wies einfacher geht?


    [FONT=&quot] [/FONT]SELECT id, Vorname, Zuname FROM Person JOIN
    (SELECT ida, idm FROM spielt WHERE ida IN
    (SELECT temp.ida FROM
    (SELECT ida, idm FROM spielt GROUP BY idm, ida) AS temp
    GROUP BY temp.ida
    HAVING COUNT(temp.ida)=1)
    GROUP BY ida, idm) AS temp1
    ON (Person.id=temp1.idm);

    ERGEBNIS:
    1000 Peter Maier 1001 Karin Huber 1003 Franz Huber

  • @ candyman
    bist du dir sicher das bsp 23 so stimmt?
    wenn du bei select noch zusätzlich select ...., werk.komponiert ausgeben lässt , werden auch werke ausgegeben die 1968 komponiert worden sind.
    Ich hab 23. so gelöst: (bin mir aber auch nicht sicher obs so stimmt)


    Code
    1. select vorname, zuname, extract(year from komponiert)
    2. from person natural join komponist, werk
    3. where extract(year from werk.komponiert) in (select extract(year from komponiert) from werk where extract(year from komponiert) = 1987 and not exists (select extract(year from komponiert) from werk where extract(year from komponiert) = 1968))
  • hab die differenz zwischen Frage 13 und 14 verstanden.
    Also bei 13 sollen wir ausgeben die Komponisten dir alleine und nur sie alleine all ihre werke geschrieben haben.
    Bei 14 ist es aber so das wir alle koponisten ausgeben sollen die zumindest bei jedem ihrer werke einen Teil des textes selbst geschrieben haben es können aber mehrer mit geschrieben haben.
    Was bei Frage 13 nicht der Fall ist.
    Ist das hoffentlich für jeden verständlich bitte um verbesserung wenn ich mich irren sollte.

  • nach dem zusatz hab ich 13 jetzt so:

    Code
    1. select vorname, zuname, geburtsdatum from person natural join werk
    2. where person.id not in
    3. (select id from person natural join textwerk where textwerk.id != textwerk.texter)
    4. group by vorname, zuname, geburtsdatum


    Ausgabe:

    Code
    1. vorname zuname geburtsdatum
    2. Peppi Bauer 1957-10-14
    3. Franz Oberdorfer 1905-12-24
    4. Robert Schmitt 1937-02-04

    :cheer: manamana :dance: düdüdüdüdü :trampolin: :cheer:

  • Quote from Burgi

    Nochmal zu Beispiel 14:
    Hier gehts ja darum dass die Komponisten aufgelistet werden sollen, die nur TextWerke haben und diese auch nur mit eigenem Text. Die Lösung müsste ja Pepi Bauer 2002 sein.


    Wieso nur pepi bauer 2002?
    auch robert schmitt 2001 hat sich von keinem andren texte schreiben lassen..


    ich hab das so

    Code
    1. select vorname, zuname, geburtsdatum from person natural join textwerk
    2. where person.id not in
    3. (select id from person natural join textwerk where textwerk.id != textwerk.texter)
    4. group by vorname, zuname, geburtsdatum


    Ausgabe:

    Code
    1. vorname zuname geburtsdatum
    2. Robert Schmitt 1937-02-04
    3. Peppi Bauer 1957-10-14

    :cheer: manamana :dance: düdüdüdüdü :trampolin: :cheer:

  • @ Venefica


    Wieso nur pepi bauer 2002?
    auch robert schmitt 2001 hat sich von keinem andren texte schreiben lassen..


    robert schmitt hat nicht für alle seine werke einen text geschrieben und die aufgabenstellung lautet die komponisten zu finden die zu allen ihren werken den text selbst verfasst haben

  • Kann es sein, dass es einen Fehler in der Datenbank gibt?


    Wenn man

    Quote

    SELECT p.Vorname, p.Zuname, p.geburtsdatum, t.texter, w.titel, w.id
    FROM Person p NATURAL JOIN
    Komponist k NATURAL JOIN
    Werk w LEFT OUTER JOIN
    TextWerk t ON w.ID = t.ID

    ausführt, gibt es Werke, die keine textwerke sind, aber trotzdem einen Texter angegeben haben (also nicht NULL, obwohl das so gehören würde).

  • hab das problem gefunden...also wenn du diesen code benutzt siehst du den fehler:

    SQL
    1. SELECT *
    2. FROM werk w left outer join
    3. textwerk t on w.id = t.ID

    also sollten wir nicht nur die IDs vergleichen aber auch die Titel, dann siehst du den unterschied(auch den mit der Marschmusik):

    SQL
    1. SELECT *
    2. FROM werk w left outer join
    3. textwerk t on w.ID = t.ID AND w.Titel = t.Titel
  • Quote from Kitty

    Naja und die Tabelle zeigt dass nur Peppi Bauer die Lösung sein kann. Er ist ja der einzige der nur Textwerke geschrieben hat zu denen er auch den Text verfasst hat.

    genau :thumb:


  • liefert bei mir keine ergebnisse, wobei aber die zwei bauer peppis 1987 ein werk komponiert haben und 1968 keines. der 2001 robert schmitt hat 1987 zwar was komponiert aber 1968 auch und deswegen darf er nicht ins ergebnis.
    die werk tabelle anzeigen zur überprüfung:
    select * from werk