u kunt geen subquery gebruiken in deze expressie

Status
Niet open voor verdere reacties.

tartuffe2

Gebruiker
Lid geworden
30 nov 2016
Berichten
56
Hey,

ik ben van alles aan het experimenteren maar ik vind het wel moeilijk om te weten wat mag en wat niet met subqueries.
Bv nu wil ik de beste klant vinden (met het meest aantal gereden km).
Ik redeneer zo:
1) groepeer ze en bereken hun totaal aantal gereden km.
2) vergelijk telkens deze totalen met de max van deze totalen.

Ik heb dat geprobeerd maar krijg altijd "u kunt geen subquery gebruiken in deze expressie max(som)". Waarom? Volgens welke regel? En hoe moet het dan? Ik heb 'expressie' gezet in de rij Totaal want 'group by' en 'waar' gaan sowieso niet.
Bestaat er soms enkele elementaire regels met wat mag en wat niet (bv wat mag wel/niet onder "group by"), want wat ik doe is meer 'trial and error'.
Bedankt.
Het bestand:
 

Bijlagen

  • besteklant.zip
    33,3 KB · Weergaven: 11
Hier heb je wellicht iets aan:
Gebruik gewoon enkele extra query's
 

Bijlagen

  • besteklant.zip
    31,3 KB · Weergaven: 15
Dat kan gewoon met één query:
Code:
SELECT TOP 3 Klanten.klantnaam, Sum(Ritten.[aantal km]) AS Totaal, Max(Ritten.[aantal km]) AS [MaxVanaantal km]
FROM Klanten INNER JOIN Ritten ON Klanten.klantnummer = Ritten.klantnummer
GROUP BY Klanten.klantnaam
ORDER BY Max(Ritten.[aantal km]) DESC;

Ik heb er voor het mooie een top 3 van gemaakt, zodat je kunt zien wat er gebeurt in de query. Overigens is het érg onhandig om gereserveerde woorden (Max, Som) te gebruiken in veldnamen. Daar kan Access niet goed tegen :).
 
En nog een variant op het totaal aantal kilometers; de vorige keek naar de gebruiker met de langste ritten :).
Code:
SELECT TOP 3 Klanten.klantnaam, Sum(Ritten.[aantal km]) AS Totaal, Max(Ritten.[aantal km]) AS [MaxVanaantal km]
FROM Klanten INNER JOIN Ritten ON Klanten.klantnummer = Ritten.klantnummer
GROUP BY Klanten.klantnaam
ORDER BY Sum(Ritten.[aantal km]) DESC;
 
Bedankt.
Het kan inderdaad in verschillende queries, maar ik probeer dit in één subquery te doen.
Beide situaties geven de foutmelding u kunt geen subquery gebruiken in deze expressie:
crit.png
crit2.png

Is het mogelijk te zeggen waarom? Ik stel me de vraag of een expert (zoals u) direct kan zien in het Design venster, voor het uitproberen, dat deze situaties een foutmelding gaan veroorzaken. Ik moet eerst proberen om dan vast te stellen dat het niet gaat. Maar vraag me niet waarom. En dat vind ik zo vervelend, want dan leer je niet bij.

Bij de tweede query wil ik naast de dalende lijst van de beste klanten met de som van hun aantal km ook het maximum van al die sommen laten zien (dus de som van de beste klant 242 km).
Bestand:

Bedankt.
 

Bijlagen

  • besteklant2.zip
    33 KB · Weergaven: 9
Het kan inderdaad in verschillende queries, maar ik probeer dit in één subquery te doen.
De grap is: je gebrúikt geen subquery. Dus wat versta jij onder een subquery? Dan kunnen we wellicht wat beter inschatten wat je nu daadwerkelijk wilt. Maak anders een excelletje met de gewenste uitkomst.
 
En waarom heb je míjn queries niet getest? Dat is namelijk (vind ik nog steeds) volgens mij wat je bedoelt...
 
Ik heb ze getest. Die zijn prima.
Ik zou alleen een uitleg willen waarom beide situaties die foutmelding geven. Tegen welke regel zondig ik?

Bij de tweede query wou ik proberen om ook de maximale som te hebben (242) overal naast elke klant. Dan kan je bv het verschil berekenen tussen die maximale waarde en hun eigen som. Maar max van de som berekenen gaat blijkbaar niet. Enig idee hoe dat moet?
 
Wat je fout doet? Om te beginnen gebruik je dus gereserveerde woorden als veldnaam (Max, Som). Moet je dus nooit doen, want dat gaat geheid een keer fout. Ik weet niet of dat hier ook speelt, omdat er dus meer fouten in je queries zitten. De belangrijkste (en die levert de subquery fout op denk ik, ook al gebruik je dus geen subquery) is: gebruikt een functie (Max) op een veld dat niet te maximaliseren is. Je groepeert op een specifiek veld (Klantnaam) dus de som die je daar berekent levert exact één waarde op. Die wordt tegelijk berekend met de Max die je ernaast berekent, wat sowieso dus hetzelfde getal oplevert; als je één waarde heb, is Min - Max = Gem = Som. Da's allemaal niet zo moeilijk te snappen. Bekijk mijn voorbeeld nog eens van hoe een Subquery er uit ziet, en waarom mijn query wél werkt.
 
Ok. Ik vraag je nog één laatste ding en dan laat ik je met rust.
Hoe dit bekomen: de hoogste som naast alle andere plaatsen?
beste.png
Bestand:
 

Bijlagen

  • besteklant3.zip
    32,3 KB · Weergaven: 12
Grootste som van wat? In je voorbeeldplaatje kloppen de cijfers niet.
 
Ik pas je voorbeeldje wel even aan. Weet trouwens niet of ik al toe ben aan de beloofde rust :).
 
Bedoel je deze variant?
Code:
SELECT Klanten.klantnaam, Sum(Ritten.[aantal km]) AS totaal, (SELECT Top 1 Sum([Aantal km]) FROM Ritten Group By Klantnummer Order By Sum([Aantal km]) Desc) AS maxWaarde, [Totaal]/[maxWaarde] AS Klantwaarde
FROM Klanten INNER JOIN Ritten ON Klanten.klantnummer = Ritten.klantnummer
GROUP BY Klanten.klantnaam
ORDER BY Sum(Ritten.[aantal km]) DESC;
 
Ja, dat is het. Wat ik vergat te doen, dat is die TOP 1 sum( ...).
Bedankt. Geniet nu van je weekend
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan