probleem met having, group by

Status
Niet open voor verdere reacties.

pattex007

Gebruiker
Lid geworden
26 jan 2010
Berichten
15
hallo

ik probeer een query te schrijven om de spelers uit te halen per ploeg die meer doelpunten hebben gescoord dan de gemiddelde door hun ploeg gemaakt werden:

[SQL]select wo.opstellingid, s.naam ,p.naam ,d.aantal from speler s , ploeg p, wedstrijdopstelling wo, doelpunten d
where s.stamnummer = p.stamnummer and s.rijksregisternummer = wo.rijksregisternummer
and wo.opstellingid = d.opstellingid and d.aantal != 0[/SQL]

naamloostah.png



ik heb deze query geprobeert maar krijg onvoldoende gegevens:

[SQL]select wo.opstellingid, s.naam ,p.naam ,d.aantal , avg(d.aantal) from speler s , ploeg p, wedstrijdopstelling wo, doelpunten d
where s.stamnummer = p.stamnummer and s.rijksregisternummer = wo.rijksregisternummer
and wo.opstellingid = d.opstellingid and d.aantal != 0
group by p.naam
having d.aantal > avg(d.aantal) [/SQL]

93094513.png
 
Laatst bewerkt:
Je hebt de GROUP BY op p.naam, dat is de naam van de ploeg. Ik vermoed dat het daarom mis gaat. (Het helpt als je dingen renamet zodat ze duidelijk te onderscheiden zijn, dus p.naam as ploegnaam en s.naam as spelernaam bijvoorbeeld)

Scheelt je ook een hoop problemen met PHP later, gezien die elke naam maar 1x kan gebruiken.
 
Je hebt de GROUP BY op p.naam, dat is de naam van de ploeg. Ik vermoed dat het daarom mis gaat. (Het helpt als je dingen renamet zodat ze duidelijk te onderscheiden zijn, dus p.naam as ploegnaam en s.naam as spelernaam bijvoorbeeld)

Scheelt je ook een hoop problemen met PHP later, gezien die elke naam maar 1x kan gebruiken.

dank u wel voor uw antwoord, idd het was onduidelijk en heb aangepast

[SQL]select wo.opstellingid, s.naam as spelernaam ,p.naam as ploegnaam ,d.aantal , avg(d.aantal) from speler s , ploeg p, wedstrijdopstelling wo, doelpunten d
where s.stamnummer = p.stamnummer and s.rijksregisternummer = wo.rijksregisternummer
and wo.opstellingid = d.opstellingid
group by ploegnaam
having d.aantal > avg(d.aantal) [/SQL]

wat moet er dan staan bij group by ? want het is per ploeg de spelers er uithalen
 
Als je alle spelers wilt hebben, gesorteerd per ploeg, dan moet de GROUP BY op de spelernaam en moet je een ORDER BY toevoegen op de groepsnaam. Je groepeert resultaten per speler (dus alle rijen van dezelfde speler worden samengevoegd) en sorteert ze per club (zodat de spelers van elke club bij elkaar komen)
 
Als je alle spelers wilt hebben, gesorteerd per ploeg, dan moet de GROUP BY op de spelernaam en moet je een ORDER BY toevoegen op de groepsnaam. Je groepeert resultaten per speler (dus alle rijen van dezelfde speler worden samengevoegd) en sorteert ze per club (zodat de spelers van elke club bij elkaar komen)


dus zo :
[SQL]SELECT wo.opstellingid, s.naam AS spelernaam ,p.naam AS ploegnaam ,d.aantal , avg(d.aantal) FROM speler s , ploeg p, wedstrijdopstelling wo, doelpunten d
WHERE s.stamnummer = p.stamnummer AND s.rijksregisternummer = wo.rijksregisternummer
AND wo.opstellingid = d.opstellingid
GROUP BY spelernaam
HAVING d.aantal > avg(d.aantal)
ORDER BY ploegnaam[/SQL]

dan krijg ik maar 1 speler te zien van 1 ploeg, terwijl er 2 ploegen zijn :
naamloosni.png
 
Hrm. Ik lig er al langer uit dan ik dacht :p

Ik zie inderdaad dat dit mis gaat. Omdat je groepeert op speler wordt waarschijnlijk het gemiddelde ook niet langer berekend over de club maar alleen over de speler. Ik denk dat je een subquery nodig hebt om de gemiddelden uit te rekenen van de hele club om dit op te lossen.

Tenzij iemand anders nog een oplossing ziet...
 
Hrm. Ik lig er al langer uit dan ik dacht :p

Ik zie inderdaad dat dit mis gaat. Omdat je groepeert op speler wordt waarschijnlijk het gemiddelde ook niet langer berekend over de club maar alleen over de speler. Ik denk dat je een subquery nodig hebt om de gemiddelden uit te rekenen van de hele club om dit op te lossen.

Tenzij iemand anders nog een oplossing ziet...

idd met subquery krijg ik juiste data terug, dank u wel voor uw antwoord
[SQL]
SELECT wo.opstellingid, s.naam AS spelernaam ,p.naam AS ploegnaam ,d.aantal FROM speler s , ploeg p, wedstrijdopstelling wo, doelpunten d
WHERE s.stamnummer = p.stamnummer AND s.rijksregisternummer = wo.rijksregisternummer
AND wo.opstellingid = d.opstellingid
GROUP BY spelernaam
HAVING d.aantal > (select avg(aantal) from doelpunten )
[/SQL]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan