Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] probleem met resultaat

Pagina: 1
Acties:
  • 106 views sinds 30-01-2008
  • Reageer

  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Ik weet niet hoe ik dit probleem het beste kan noemen, maar hier komt het:

Ik heb 2 tabellen in Access:

- Clients
- Uren

De clientstabel bevat uiteraard klantgegevens. De urentabel bevat records welke uren bevatten die geschreven zijn op een klant. Ieder geschreven uur moet geaccordeerd worden. Indien een urenregel geaccordeerd is dan wordt dit aangegeven met het veld "Uren_Akkoord".

Nu kan ik een query samenstellen welke alle uren toont van alle klanten. Echter een klant kan voor een bepaalde maand bijvoorbeeld 5 geaccoordeerde urenregels hebben en 2 niet-geaccoordeerde regels. Die klant wil ik dan niet in mijn overzicht tonen, alleen de klanten waarvan alle urenregels in een maand geaccoordeerd zijn. (Dit ivm facturen die geprint moeten worden)

Mijn query ziet er nu als volgt uit:

code:
1
SELECT * FROM Clients LEFT JOIN Uren ON Clients.Client_ID = Uren.Uren_ClientID


En genereert de volgende tabel:

http://www.xs4all.nl/~uwsite/tabel.gif

Wat ik dus wil bereiken is dat "Jaap" niet in mijn resultaten terugkomt,aangezien 1 urenregel van hem niet is geaccordeerd, maar Hans wel aangezien zijn urenregels wel geaccordeerd zijn.

Kan iemand mij in de goede richting wijzen ?

Pay peanuts get monkeys !


  • Ascathon
  • Registratie: Augustus 2004
  • Laatst online: 20-11 11:41
Misschien kun je iets met WHERE? Je wilt bepaalde records niet zien dus die moet je gaan filteren.
http://www.w3schools.com/sql/sql_where.asp

[ Voor 30% gewijzigd door Ascathon op 27-12-2007 19:49 ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:26

remco_k

een cassettebandje was genoeg

En kijk dan gelijk effe naar GROUP BY ...
Dan moet het lukken.

Hmm, de resultset voorwaarden had ik niet al te best gelezen...
Had het begrepen als 'ik wil elke naam maar 1x in de resultset hebben'.

[ Voor 57% gewijzigd door remco_k op 27-12-2007 20:00 ]

Alles kan stuk.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:07
selecteer alle klanten die enkel 'geaccordeerde' urenregels hebben dus.
Maw, een klant die voorkomt in de lijst van 'niet geaccordeerde uren' mag niet voorkomen in jouw lijst.
Met een simpele where ga je dat niet kunnen doen, aangezien een gewone WHERE enkel de niet geaccordeerde uren er zal uitfilteren. In jouw geval zal 'Jaap' dan wel in je lijst voorkomen, maar enkel met zijn geaccordeerde uren.

Wat je dus zal moeten doen, is met een subquery werken. Die subquery geeft een set terug van klanten die niet geaccordeerde uren hebben, en dan zal jij met je 'hoofdquery' de klanten moeten selecteren die niet in die sub-lijst voorkomen:
pseudo-code
code:
1
2
3
4
5
6
7
8
select * 
from klanten
where klantid not in
 ( select klantid
   from klanten 
   inner join uren on ...
   where uren.geaccordeerd = false 
 )
remco_k schreef op donderdag 27 december 2007 @ 19:56:
En kijk dan gelijk effe naar GROUP BY ...
Dat moet het lukken.
En wil je ook eens zeggen waarom hij ook naar GROUP BY moet kijken ? Ik zie nl. geen enkele aggregate functie, of nood aan aggregate functie ...

[ Voor 16% gewijzigd door whoami op 27-12-2007 19:58 ]

https://fgheysels.github.io/


  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:26

remco_k

een cassettebandje was genoeg

whoami schreef op donderdag 27 december 2007 @ 19:57:En wil je ook eens zeggen waarom hij ook naar GROUP BY moet kijken ? Ik zie nl. geen enkele aggregate functie, of nood aan aggregate functie ...
Klopt, ik die nood heeft ie ook niet. Schrijf ik dat dan? :+

Alles kan stuk.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:07
Ja, je zegt dat hij naar GROUP BY moet kijken.
Wel, group by heeft enkel en alleen zin (en kan enkel en alleen juist gebruikt worden) als je gebruik maakt van een aggregate functie.

https://fgheysels.github.io/


  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:26

remco_k

een cassettebandje was genoeg

Uh, ik had gedacht dat je m'n vorige post nog even zou opzoeken en lezen... Dat was natuurlijk niet vanzelfsprekend.
Naja, dan quote ik mezelf even:
remco_k schreef op donderdag 27 december 2007 @ 19:56:
En kijk dan gelijk effe naar GROUP BY ...
Dan moet het lukken.

Hmm, de resultset voorwaarden had ik niet al te best gelezen...
Had het begrepen als 'ik wil elke naam maar 1x in de resultset hebben'.
We zitten dus op dezelfde lijn.

[ Voor 4% gewijzigd door remco_k op 27-12-2007 20:46 ]

Alles kan stuk.


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Ik krijg het maar niet voor elkaar.

Ik heb nu deze query en begrijp de gedachte er ook achter, maar ik krijg maar geen resultaat:

code:
1
SELECT * FROM Clients WHERE NOT EXISTS (SELECT * FROM Clients LEFT JOIN Uren ON Clients.Client_ID = Uren.Uren_ClientID Where Uren_Akkoord=off)


De hoofdquery geeft alle Clients terug. De subquery geeft alleen die clients terug waarvan de uren niet geaccordeerd zijn. Afzonderlijk werken de query's dus.

Kortom met bovenstaande query moet ik dan de clients te zien krijgen waarvan de uren wel geaccordeerd zijn, maar wat ik ook probeer, ik krijg geen resultaat.

Pay peanuts get monkeys !


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 08:06

NetForce1

(inspiratie == 0) -> true

EXISTS werkt ietwat anders dan NOT IN, je moet in je subquery de client id uit de uren tabel vergelijken met de client id van de outer query, zo dus:
SQL:
1
2
3
4
5
6
7
SELECT * 
FROM Clients 
WHERE NOT EXISTS 
( SELECT Uren_ClientID
  FROM Uren
  WHERE Uren_ClientID = Clients.Client_ID AND Uren_Akkoord = off
)

[ Voor 29% gewijzigd door NetForce1 op 28-12-2007 08:52 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • mr_derk
  • Registratie: September 2005
  • Laatst online: 21:01
als je toch al in acces werkt, waarom maak je dan geen query in de ontwerpweergave ;)

  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Thanks ! Het werkt nu perfect !

Pay peanuts get monkeys !


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
mr_derk schreef op vrijdag 28 december 2007 @ 09:58:
als je toch al in acces werkt, waarom maak je dan geen query in de ontwerpweergave ;)
Omdat je dan je mogelijkheden van JetSQL nog verder beperkt? Je kunt niet elke query in de ontwerpweergave maken, omdat deze bepaalde complexe queries niet goed kan weergeven. Simpele joins en dat soort queries gaan nog wel met de ontwerpweergave, maar bij subqueries ben je al snel verplicht om ze gewoon in SQL mode te schrijven. Overigens is dit gebaseerd op mijn ervaringen met Access 2003 en eerder.
Pagina: 1