Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

SQL-plus vraagstukje waar ik niet uit kom

beheer25
6 antwoorden
  • Bij mijn avondstudie databasespecialist zijn we nu bezig met SQL-plus. 1 van de praktijkopgaven kan ik niet opgelost krijgen. Het gaat om een database waarin alle presidenten van de VS zijn opgeslagen, samen met oa huwelijken en hobbies.
    In deze database zitten onder andere de volgende twee tabellen: President en Pres_hobby. President heeft oa pres_name en party als attributen, waarbij pres_name de primaire sleutel is. Pres_hobby heeft twee attributen, pres_name en hobby, die samen de primaire sleutel vormen. Pres_hobby.pres_name is vreemde sleutel mbt president.pres_name.

    De vraag is: Geef de naam van de president, met hun partij en het aantal hobbies van die presidenten, die het grootste aantal hobbies hebben van alle presidenten binnen hun partij.

    Ik heb wel wat zitten proberen (zie onder), maar dan krijg ik maar 1 president te zien, namelijk degene met de meeste hobbies van alle presidenten, en de bedoeling is dus van elke partij de president met de meeste hobbies…

    SELECT p.party, p.pres_name, count(*)
    FROM president p, pres_hobby h
    WHERE p.pres_name = h.pres_name
    GROUP BY p.party, p.pres_name
    HAVING count(*) = (SELECT max(count(*))
    FROM president p2, pres_hobby h2
    WHERE p2.pres_name = h2.pres_name
    GROUP BY p2.pres_name);

    Wie kan mij helpen?
  • Heb je Access ?

    Hierin probeer je eerst de query ( visueel ) te maken. Dan voer je de
    query uit. Als het resultaat is wat je wilt, lees je het SQL statement uit
    en klaar.
  • Dat heb ik ook al geprobeerd, maar ook dat krijg ik niet voor elkaar. Het probleem zit hem in : max(count(*)). Er zal wel iets fout zitten in het groeperen, maar ik kom er dus niet uit.
  • Ik heb even zitten puzzelen. Ik kom er ook niet helemaal uit, maar mischien dat je hiermee wat verder komt:

    [code:1:2792a6c72e]
    SELECT o.party, Max(o.Count)
    FROM (SELECT p.pres_name, p.party, Count(h.hobby)
    FROM president p, pres_hobby h
    WHERE p.pres_name = h.pres_name
    GROUP BY p.pres_name, p.party) o
    GROUP BY o.party;
    [/code:1:2792a6c72e]

    Bij elk ingewikkelder SQL vraagstuk geldt eigenlijk het [b:2792a6c72e]Verdeel en Heers [/b:2792a6c72e]principe.

    Bovenstaande query levert je de partijen met het max aantal hobbies van de president. Nu moet je nog proberen om de namen van de juiste president erbij te figulieren. Dit lukte me niet.


    Suc6,
  • [quote:4555e08d45="Irene"]De vraag is: Geef de naam van de president, met hun partij en het aantal hobbies van die presidenten, die het grootste aantal hobbies hebben van alle presidenten binnen hun partij.
    [/quote:4555e08d45]
    1. Selectie op pres_hobby[code:1:4555e08d45]
    SELECT h.pres_name, COUNT(*) AS Aantal
    FROM pres_hobby h
    GROUP BY pres_name
    [/code:1:4555e08d45]
    Resultaat:
    [code:1:4555e08d45]
    PRES_NAME AANTAL
    ——— ———-
    ADAMS J Q 3
    ARTHUR C A 1
    CLEVELAND G 1
    COOLIDGE C 5
    EISENHOWER D D 5
    GARFIELD J A 1
    HARDING W G 3
    HARRISON B 1
    HAYES R B 3
    HOOVER H C 2
    JACKSON A 1
    JEFFERSON T 2
    JOHNSON L B 1
    KENNEDY J F 3
    LINCOLN A 1
    MCKINSLEY W 3
    NIXON R M 1
    ROOSEVELT F D 3
    ROOSEVELT T 7
    TAFT W H 2
    TAYLOR Z 1
    TRUMAN H S 3
    VAN BUREN M 1
    WASHINGTON G 2
    WILSON W 3[/code:1:4555e08d45]
    2. Carthesisch produkt op president en pres_hobby
    [code:1:4555e08d45]
    SELECT p1.pres_name, p1.party, COUNT(h1.hobby) AS Aantal
    FROM president p1, pres_hobby h1
    WHERE p1.pres_name = h1.pres_name
    GROUP BY p1.pres_name, p1.party
    [/code:1:4555e08d45]
    Resultaat:
    [code:1:4555e08d45]
    Veel typewerk ;)
    [/code:1:4555e08d45]
    3. Grootste aantal hobbies van een president per partij.
    [code:1:4555e08d45]
    SELECT p1.party, MAX(Aantal)
    FROM ( SELECT p1.pres_name, p1.party, COUNT(h1.hobby) AS Aantal
    FROM president p1, pres_hobby h1
    WHERE p1.pres_name = h1.pres_name
    GROUP BY p1.pres_name, p1.party
    )
    GROUP BY p1.party
    [/code:1:4555e08d45]
    Resultaat:
    [code:1:4555e08d45]
    Nog meer typewerk ;)
    [/code:1:4555e08d45]

    Combineer bovenstaande, en dan zou [i:4555e08d45]een mogelijke oplossing[/i:4555e08d45] kunnen zijn:
    [code:1:4555e08d45]
    SELECT p1.pres_name, p1.party, Aantal
    FROM (SELECT p3.party, MAX(Aantal2) AS AantalHobbies
    FROM ( SELECT p3.pres_name, p3.party, COUNT(h3.hobby) AS Aantal2
    FROM president p3, pres_hobby h3
    WHERE p3.pres_name = h3.pres_name
    GROUP BY p3.pres_name, p3.party
    )
    GROUP BY p3.party
    ) table1
    LEFT JOIN
    ( SELECT p1.pres_name, p1.party, COUNT(h1.hobby) AS Aantal
    FROM president p1, pres_hobby h1
    WHERE p1.pres_name = h1.pres_name
    GROUP BY p1.pres_name, p1.party
    ) table2
    ON table1.party = table2.party
    WHERE table1.AantalHobbies = table2.Aantal
    [/code:1:4555e08d45]

    NB. In Oracle heeft de LEFT JOIN[/color:4555e08d45] een andere notatie. Iets van (*)[/color:4555e08d45]. Dit moet je zelf ff uitzoeken.
  • Bedankt voor de uitleg! Nu moet het lukken.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.