Toon posts:

[Access + SQL] Probleem met GROUP BY

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem:

Een tabel met werknemers(agent):

AgentID(PK), Achternaam, Voornaam

Een tabel met beoordelingen:

BeoordelingID(PK), AgentID(FK), Cijfer, Datum

Om de datum van de laatste beoordeling per werknemer te krijgen gebruik ik de volgende query:

code:
1
2
3
4
SELECT a.Achternaam, a.Voornaam, max(b.Datum)
FROM Agent a, Beoordeling b
WHERE a.AgentID = b.AgentID
GROUP BY a.AgentID, a.Achternaam, a.Voornaam;


Werkt perfect, maar nu wil ik ook het cijfer van de laatste beoordleing erbij hebben:
code:
1
2
3
4
SELECT a.Achternaam, a.Voornaam, max(b.Datum), b.Cijfer
FROM Agent a, Beoordeling b
WHERE a.AgentID = b.AgentID
GROUP BY a.AgentID, a.Achternaam, a.Voornaam, b.Cijfer;


Zou je denken, maar hier gaat het mis. Nu krijg ik alle beoordelingen, en niet alleen de laatste! Hoe zou ik dit in Access SQL op kunnen lossen?

Verwijderd

Hoe ziet de tabel eruit? Is b.Cijfer wel te grouperen?

Verwijderd

Topicstarter
Verwijderd schreef op 30 september 2002 @ 14:20:
Hoe ziet de tabel eruit? Is b.Cijfer wel te grouperen?
b.Cijfer moet (in Access) gegroupeerd worden aangezien je hem ook weer wilt geven.
Alle niet statistische functies die je selecteert moeten in de GROUP BY...

Verwijderd

Ik weet dat als je 'm wilt weergeven dat je 'm in de group by functie moet toevoegen, maar misschien is de kolom b.cijfer niet te grouperen. Stel dat b.cijfer allemaal unieke nummers bevat, dan kun je grouperen wat je wilt, maar krijg je natuurlijk alle beoordelingen.

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 15:35

Peetman

Tjah....

Je moet in de where clause een subquery zetten. b.Datum moet namelijk gelijk zijn aan max b.Datum voor dat AgentID.

Verwijderd

peetman schreef op 30 september 2002 @ 14:39:
Je moet in de where clause een subquery zetten. b.Datum moet namelijk gelijk zijn aan max b.Datum voor dat AgentID.
In de eerste selectie lukt het toch ook volgens de topicstarter? En daar zit ook geen subquery in.
Ik denk dat dat die b.cijfer niet te grouperen valt binnen dit geheel.

Verwijderd

Probeer het eens met "First".

SELECT Agent.Achternaam, Agent.Voornaam, Max(Beoordeling.Datum) AS MaxOfDatum, First(Beoordeling.Cijfer) AS FirstOfCijfer
FROM Agent INNER JOIN Beoordeling ON Agent.AgentID = Beoordeling.AgentID
GROUP BY Agent.Achternaam, Agent.Voornaam;

[Edit]: dit werkt alleen als er maximaal 1 cijfer per persoon per tijdstip wordt vastgelegd! Leg je meerdere cijfers vast op dezelfde datum zonder tijd dan werkt het niet. Leg de datum met tijd vast, dan krijg je van alle personen de laatste cijfers.

Cheers,
Underscore

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 15:35

Peetman

Tjah....

Verwijderd schreef op 30 september 2002 @ 14:46:
[...]


In de eerste selectie lukt het toch ook volgens de topicstarter? En daar zit ook geen subquery in.
Ik denk dat dat die b.cijfer niet te grouperen valt binnen dit geheel.
Ja, dat is wel zo, maar nu wil hij ook nog een keer alleen de laatste beoordeling erbij. Aangezien het hier gaat om een zgn catargisch produkt van 2 tabellen zal je nog een extra voorwaarde in de Where clause moeten zetten om de waarden die hij in dit geval weer niet wil hebben eruit te filteren. :)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Probeer deze query maar eens (als Abcess dit tenminste begrijpt):
code:
1
2
3
4
5
6
7
8
SELECT a.Achternaam, a.Voornaam, b.Datum, b.Cijfer
FROM Agent a
INNER JOIN (
    SELECT AgentID, MAX (Datum) AS MaxDatum
    FROM Beoordeling
    GROUP BY AgentID
    ) AS bdatum ON bdatum.AgentID = a.AgentID
INNER JOIN Beoordeling b ON b.AgentID = bdatum.AgentID AND b.Datum = bdatum.MaxDatum

Never underestimate the power of


Verwijderd

Topicstarter
peetman schreef op 30 september 2002 @ 15:56:
[...]


Ja, dat is wel zo, maar nu wil hij ook nog een keer alleen de laatste beoordeling erbij. Aangezien het hier gaat om een zgn catargisch produkt van 2 tabellen zal je nog een extra voorwaarde in de Where clause moeten zetten om de waarden die hij in dit geval weer niet wil hebben eruit te filteren. :)
Heb gedacht aan een HAVING:

HAVING b.datum = max(b.Datum)

Doet het helaas ook niet...

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 01 oktober 2002 @ 12:21:
Heb gedacht aan een HAVING:

HAVING b.datum = max(b.Datum)

Doet het helaas ook niet...
Dat geloof ik direct. Ik vrees dat je nog niet helemaal begrijpt hoe group by werkt.
Het zou verstandig zijn als je je daar nog eens in zou verdiepen.

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 01 oktober 2002 @ 12:37:
[...]

Dat geloof ik direct. Ik vrees dat je nog niet helemaal begrijpt hoe group by werkt.
Het zou verstandig zijn als je je daar nog eens in zou verdiepen.
Begrijp vrij aardig hoe een GROUP BY werkt. Als je een query maakt met een agregate functie (SUM, COUNT, etc...) dan moet er een GROUP BY clausule gebruikt worden. GROUP BY geeft namelijk aan op welke variabele er gegroepeerd moet worden. Anders weet het DBMS niet hoe de data samengepakt moet worden.

Probleem dus ook met Access is dat alles dat er geselcteerd wordt (muv de aggr. functies) ook gegroupeerd moet worden. Ik wil dus juist niet groeperen op het cijfer, maar Access dwingt me om dat wel te doen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Probleem is alleen dat je per AgentID een aantal beoordeling records terugkrijgt. Bij de datum zeg je dat je de MAX terug wilt hebben, maar je vertelt niet welk cijfer Access terug moet geven. MAX en MIN werken dan niet, omdat dan niet naar de datum wordt gekeken.
Maar had je mijn oplossing al geprobeerd?

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 01 oktober 2002 @ 16:09:
Probleem is alleen dat je per AgentID een aantal beoordeling records terugkrijgt. Bij de datum zeg je dat je de MAX terug wilt hebben, maar je vertelt niet welk cijfer Access terug moet geven. MAX en MIN werken dan niet, omdat dan niet naar de datum wordt gekeken.
Maar had je mijn oplossing al geprobeerd?
Nog niet, zit nu niet op m'n werk maar bij studievereniging. Op m'n werk is er ook geen internet (is er wel, maar niet voor mij), dus ik zal het zo even moeten uitprinten...
Pagina: 1