Datemod Beispiel 3

  • Ok also was habe ich bis jetzt:


    Übung1:
    1:
    select Vorname, Zuname, GeburtsDatum from Person
    2:
    select Vorname, Zuname, GeburtsDatum from Person natural join musiker
    3:
    select vorname, zuname, geburtsdatum from Person natural join komponist where extract(year from geburtsdatum)>=1960 AND extract(month from geburtsdatum)>=1 AND extract(day from geburtsdatum)>1
    4:
    select vorname, zuname, (sterbedatum - geburtsdatum)/'365' as age from person natural join verstorbeneperson
    5:
    select vorname, zuname,(current_date - geburtsdatum)/'365' as age from person natural join komponist, verstorbeneperson where Person.ID != VerstorbenePerson.ID


    problem: bei den berechnungen für das alter werden keine schaltjahre berücksichtigt also ist eine gewisse ungenauigkeit vorhanden


    wenn das wer besser lösen kann bitte jetzt reinstellen


    ps: ich werde den thread hier up to date halten und immer aktualisieren wenn ich was mache also schaut öfter mal vorbei

  • das 5er hab ich so:


    select vorname, zuname, extract(year from current_date)- extract (year from geburtsdatum)as age
    from Person natural join Komponist, VerstorbenePerson
    where Person.ID != VerstorbenePerson.ID;

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

  • Also das 4er hab ich so gelöst:


    SELECT Vorname, Zuname, EXTRACT(year from age(Sterbedatum, GeburtsDatum)) AS age
    FROM Person natural join VerstorbenePerson


    die Funktion Age berechnet die Differenz zwischen den beiden Daten. Somit ist die Problematik von wegen Scchaltjahre und so nicht mehr gegeben.


    Craft4: Bei dir könnte bei der Berechnung des alters auch ein fehler auftreten, wenn die Person z.B am 8.Mai 1945 geboren, und am 5. März 2005 gestorben ist. Dann gibst du als ergebnis 50 Jahre aus, obwohl die Person eigendlich erst 49 Jahre und ein paar zerquetschte alt war...

    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.
    (Dan Rather, CBS-Fernsehreporter.)

  • stimmt, ich glaube das geht auch nicht als "rundungsfehler" durch ;-)


    muss mir die funktionen in der PostgreSQL Documentation nochmal genauer ansehen, hab das wohl überlesen


    thx !

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

  • nr7 (geht sicher kürzer..):
    [FONT=&quot]select vorname, zuname from musiker natural join person natural join beherrscht natural join instrument i where id not in (select id from musiker natural join person natural join beherrscht natural join instrument i where i.name = 'Fagott') and id in (select id from musiker natural join person natural join beherrscht natural join instrument i where i.name = 'Oboe') group by vorname, zuname[/FONT]

  • also:

    • beispiel 4 wie muerte
    • beispiel 5:
      Code
      1. Select p.vorname, p.zuname, extract(year from age(now(),p.geburtsdatum)) as age from person p natural join komponist k, verstorbeneperson v where p.id!=v.id
    • beispiel 7:
      Code
      1. [FONT=&quot]select p.vorname, p.zuname from person p natural join beherrscht b where b.name='Oboe' and b.id not in (Select id from beherrscht where name='Fagott');[/FONT]
    • beispiel 8:
      Code
      1. select p.vorname, p.zuname from person p natural join werk w group by p.id, p.vorname, p.zuname having count(p.id)>=2
    • beispiel 9:
      Code
      1. [FONT=&quot]select vorname, zuname, count(titel) as anzahl from person natural join komponist left join werk on (person.id=werk.id) group by person.id, vorname, zuname order by anzahl desc, zuname asc;[/FONT]

    ...soll ich noch mehr posten!? ;)

  • Quote from ElVis

    nr7 (geht sicher kürzer..):
    [FONT=&quot]select vorname, zuname from musiker natural join person natural join beherrscht natural join instrument i where id not in (select id from musiker natural join person natural join beherrscht natural join instrument i where i.name = 'Fagott') and id in (select id from musiker natural join person natural join beherrscht natural join instrument i where i.name = 'Oboe') group by vorname, zuname[/FONT]


    Hab ich so:
    SELECT Vorname, Zuname
    FROM Person natural join beherrscht
    WHERE Name = 'Oboe' and ID not in (SELECT ID FROM beherrscht WHERE Name = 'Fagott')


    Is das gleiche wie bei Wauki...

    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.
    (Dan Rather, CBS-Fernsehreporter.)

  • ElVis:


    Nö, denke nicht, da ohnehin NUR komponisten werke machen können!
    Und bei dieser Frage geht es doch auch nur darum, welcher komponist mind. 2 werke geschrieben hat - unabhängig davon, ob es dazu texte gibt oder nicht!

  • Quote from Mystique99

    6:
    select vorname, zuname,titel from person,werk natural join komponist where werk.id=person.id ORDER BY werk.komponiert DESC


    der vergleich werk.id = person.id ist doch wieder ein natural join


    select vorname, zuname, titel from Person natural join Komponist natural join Werk order by komponiert desc;

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

  • ich hab die ersten 4 einmal so: Wieso macht ihr hier immer einen natural join?

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

  • [quote=Wauki]also:

    • beispiel 7:
      Code
      1. [FONT=&quot]select p.vorname, p.zuname from person p natural join beherrscht b where b.name='Oboe' and b.id not in (Select id from beherrscht where name='Fagott');[/FONT]

    kurze frage -


    Sollte man nicht zuerst einen natural join auf Musiker machen ?? Oder ist der komplett unnötig - denn es steht ja explizit das man nur Musiker ausgeben soll, beherrscht ist eigentlich nur für Musiker vorgesehen
    rauskommen tut aber im endeffekt eh das selbe ...



    select vorname, zuname from (Person natural join Musiker) natural join beherrscht s where s.name = 'Oboe' and s.id not in
    (select id from beherrscht where name = 'Fagott');

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

  • Quote from Venefica

    ich hab die ersten 4 einmal so: Wieso macht ihr hier immer einen natural join?


    nun - ein natural join vergleicht die table-entrys von columns die den gleichen namen haben und selectiert nur die ergebnisse im Kreuzprodukt der Tabellen die gleich sind.


    d.h. wenn du mit where person.id = musiker.id abfragst machst du exakt das selbe

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


  • Richtig - in der tabelle "beherrscht" stehen doch schon explizit musiker drinnen und niemand sonst und die IDs sind auch die selben! Also kann ich gleich auf beherrscht gehen ohne verbindung mit musiker! ;)

  • Quote from ElVis

    auch texter texten werke, wenn du dir das model ansiehst?!
    dh. texter texten werke mit titel...


    klar texten texter weke - aber mit "werk schreiben" ist nicht das vertexten gemeint, sondern die musik! ;)
    Deshalb ist in dieser abfrage die tabelle "textwerk" vollkommen unwichtig!

  • Quote from Craft4

    nun - ein natural join vergleicht die table-entrys von columns die den gleichen namen haben und selectiert nur die ergebnisse im Kreuzprodukt der Tabellen die gleich sind.


    d.h. wenn du mit where person.id = musiker.id abfragst machst du exakt das selbe


    ah verstehe. dank dir!
    Ich nehme an es ist egal, was ich dann bei der Abgabe mach, solang das richtige rauskommt?

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

  • ich hab die 10 so:

    SQL
    1. SELECT Zuname, Geburtsdatum
    2. FROM Person NATURAL JOIN
    3. Musiker NATURAL JOIN
    4. beherrscht
    5. GROUP BY Zuname, Geburtsdatum, ID
    6. HAVING count(Name) = ( SELECT count(Name)
    7. FROM Instrument)


    und hab noch eine frage: also kann es sein dass ihre Datenbank andere Werte hate als sie die Angabe für das 3.Bsp schrieben? weil z.B. ist jetzt auch Huber ein Musiker der alle Instrumente spielt...oder liege ich falsch?


    EDIT: habe den fehler im code behoben...er achtete nich dass es mehrere musiker mit gleichen Namen geben kann (also hab ich in group by ID dazugegeben)

  • Also ich hab 10 so gelöst...


    Code
    1. [FONT=&quot]SELECT Zuname, GeburtsDatum
    2. FROM Person natural join beherrscht
    3. GROUP BY Vorname, Zuname, GeburtsDatum
    4. HAVING count(*) = (SELECT count(*) FROM Instrument)[/FONT]


    Bei mir kommt als Ausgabe nur 1 Wert, genau wies in der Angabe steht...

    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.
    (Dan Rather, CBS-Fernsehreporter.)