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

[Access 2007] GROUP BY wil niet werken

Pagina: 1
Acties:

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 11:23
Hoi,

Ik ben bezig om een query te maken waarbij een naam kan worden ingegeven, en dat dan de bijbehoren applicaties worden opgehaald.

De query werkt voor 99%, maar ik krijg nu alle applicaties meerdere keren te zien in de output van de query (dit is wanneer ik de GROUP BY eruit laat).

Ik wou er daarom een GROUP BY in zetten, maar dit werkt niet :S

SQL:
1
2
3
4
SELECT s.naam, s.ontwikkelaar, s.leverancier
FROM beheerders b, software s
WHERE s.beheerder Like "*" & [Voer een achternaam in:] & "*"
GROUP BY s.Id;


Met bovenstaande query krijg ik de foutmelding
code:
1
U probeert een query uit te voeren waarbij de opgegeven expressie naam geen deel uitmaakt van een statistische functie.


Nou is Access sowieso al niet mijn favoriet vanwege de cryptische foutmelding soms, maar hier kan ik helemaal geen wijs uit worden.

M'n database ziet er als volgt uit:
tabel "software":
Id, naam, ontwikkelaar, leverancier, beheerder (en nog wat velden, maar die gebruik ik niet in de query)

tabel "beheerders":
Id, Achternaam, Voornaam

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 23-11 23:13
Waarom gebruik je een group by?
Volgens mij moet je juist een join gebruiken in de trand van:


[sql]
Select s.naam, s.ontwikkelaar, s.leverancier
FROM beheerders b, software s
WHERE b.id = s.beheerderid And
s.beheerder Like "*" & [Voer een achternaam in:] & "*"
[/sql]

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 11:23
Als het zo makkelijk was geweest had ik dat wel gedaan. Helaas staat er in de kolom "beheerder" in de tabel "software" bijv. een waarde als "Puk, Pietje", en geen id wat overeenkomt met de tabel "beheerders". Een JOIN gaat daarom ook niet lukken, ik heb geen waarden die in beide tabellen hetzelfde betekenen.

offtopic:
Om die mooie kleurtjes te krijgen gaat [sql] niet werken, je moet dan [code=sql] <hier code> [/code] gebruiken ;)

[ Voor 31% gewijzigd door ThinkPad op 22-11-2012 12:08 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Twee drie ideetjes: :p
  1. s.naam, s.ontwikkelaar, s.leverancier toevoegen aan de group by
  2. tabel s en b moeten gejoined worden (of met INNER JOIN, of met een where-clausule).
  3. Die parameter mag wellicht niet zo in de like van access. Sowieso zijn die popupjes lelijk, beter om een formuliertje te maken dat een querydefinitie aanpast en de boel uitvoert.

[ Voor 14% gewijzigd door pedorus op 22-11-2012 12:14 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 23-11 19:04

Dido

heforshe

Je group by werkt uiteraard niet, want zo werkt een group by niet

Jij zegt dta je s.naam, s.ontwikkelaar, s.leverancier wilt zien
gegroepeerd op s.ID

Ten eerste selecteer je helemaal geen s.ID

Ten tweede geef je niet aan welke naam, ontwikkelaar of leverancier je dan bij elke s.ID zou willen zien.

Geen idee wat je doel precies is, maar met eeen group by heetf het zo te zien weinig van doen :)

Verder zou ik een join-conditie verwachen tussen je twee tabellen, want op deze manier zou je voor alle s records ook alle b records terugkrijgen, gelieerd of niet. Dat lijkt me niet de bedoeling.

[ Voor 19% gewijzigd door Dido op 22-11-2012 12:13 ]

Wat betekent mijn avatar?


  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 23-11 23:13
Oohhh thanx, ik post hier niet zo vaak.
Maar je oorspronkelijke query klopt sowieso toch niet. Ook zonder de group by niet.

Je haalt de kolommen uit tabel s en filtert op tabel s. Waarom heb je nog de tabel beheerder toegevoegd?

Of is dat een Access ding?

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Normaal gesproken voegt in Access de query design view automatische de juiste joins toe, maar dat is hier niet gebeurd als je in plain sql gaat werken ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • royjn
  • Registratie: Juni 2001
  • Laatst online: 22-11 22:20
Kun je niet 'Select distinct' gebruiken?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 23-11 19:04

Dido

heforshe

Na nog eens naar je query gekeken te hebben snap ik er eerlijk gezegd steeds minder van.

Je selecteert een cartesisch product uit twee tabellen, maar laat alleen velden uit 1 van die twee tabellen zien, terwijl die velden dus op geen enkele maner gelinkt zijn aan records uit je andere tabel.
Vervolgens wil je gaan groeperen op iets wat je niet selecteert.

En als klap op de vuurpijl zeg je dat je applicaties vaker ziet verschijnen, terwijl jouw query toch echt alleen maar namen, ontwikkelaars en leveranciers gaat laten zien, en geen applicaties.

Ik zou je willen vragen een en ander nog eens rustig en nauwkeurig te beschrijven, want het is (mij) nu niet duidelijk wat je wilt.

Wat gebeurt er als je dit probeert:
SQL:
1
2
3
select * 
from software
where  s.beheerder Like "*" & [Voer een achternaam in:] & "*" 


Je zult geen dubbelen hebben, je slecteert niet voor jan *** een tweede tabel en je hebt geen group by nodig ;)

In hoeverre wijkt het resultaat af van wat je zoekt?

[ Voor 18% gewijzigd door Dido op 22-11-2012 12:22 ]

Wat betekent mijn avatar?


  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 11:23
Excuses als het warrig overkomt. Dat vind ik soms best lastig, dat je zelf iets in je hoofd hebt zitten, en dat je dat maar moet uit zien te leggen op GoT :+

Anyways, het probleem is opgelost door in de GROUP BY alle velden op te nemen die ook in het SELECT statement staan.

Normaal gesproken zou ik inderdaad een JOIN gebruiken, maar het komt voor dat in het veld "beheerder" in de tabel "software" bijv. "Uk, Ietje" staat, en in de tabel "beheerders" staat "Puk, Pietje". Daarom kan ik ze niet 1:1 joinen, want dan klopt er niks van.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 23-11 19:04

Dido

heforshe

Waarom staat in hemelsnaam de beheerder tabel in je FROM clause? ;)

zie ook mijn edit van mij n vorgige post :)

Wat betekent mijn avatar?


  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 23-11 23:13
Je probleem is niet opgelost.
Het reultaat van je query is gewoon:

SQL:
1
2
3
4
 
SELECT s.naam, s.ontwikkelaar, s.leverancier
FROM software s
WHERE s.beheerder Like "*" & [Voer een achternaam in:] & "*" 


Alleen veel minder efficient.

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 11:23
Dido schreef op donderdag 22 november 2012 @ 12:22:
Waarom staat in hemelsnaam de beheerder tabel in je FROM clause? ;)

zie ook mijn edit van mij n vorgige post :)
Die is in deze situatie inderdaad overbodig, maar ik wil de query later nog uitbreiden zodat er per achternaam (uit de tabel 'beheerders') wordt weergegeven welke software hij/zij beheert.

Dit werkt voor nu :)
SQL:
1
2
3
4
SELECT s.id, s.naam, s.ontwikkelaar, s.leverancier, s.beheerder
FROM software s
WHERE (((s.beheerder) Like "*" & [Voer een achternaam in:] & "*"))
GROUP BY s.id, s.naam, s.ontwikkelaar, s.leverancier, s.beheerder

[ Voor 20% gewijzigd door ThinkPad op 22-11-2012 12:26 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ThinkPadd schreef op donderdag 22 november 2012 @ 12:21:
Anyways, het probleem is opgelost door in de GROUP BY alle velden op te nemen die ook in het SELECT statement staan.
precies wat je cryptische foutmelding zei dus.. je moet het alleen even weten :)
ThinkPadd schreef op donderdag 22 november 2012 @ 11:52:
Met bovenstaande query krijg ik de foutmelding
code:
1
U probeert een query uit te voeren waarbij de opgegeven expressie naam geen deel uitmaakt van een statistische functie.

  • Paul
  • Registratie: September 2000
  • Laatst online: 12:03
Je krijgt de applicaties meerdere keren (om precies te zijn, je krijgt iedere app net zo vaak te zien als dat je rijen in de beheerders-tabel hebt) te zien omdat je, door het opnemen van "beheerders b" in de FROM iedere rij in de ene tabel achter iedere rij in de andere tabel plakt.

Als je 3 beheerders hebt en 4 applicaties krijg je dus 12 resultaten:

jan - word
jan - excel
jan - access
jan - outlook
piet - word
piet - excel
piet - access
piet - outlook
klaas - word
klaas - excel
klaas - access
klaas - outlook

Vervolgens doe je niks met jan, piet of klaas maar ben je wel verbaast dat je 3x Outlook tegenkomt in je lijst ;)
Een JOIN gaat daarom ook niet lukken, ik heb geen waarden die in beide tabellen hetzelfde betekenen.
Hoe kun je er dan ooit de achternaam bij zoeken? Je hebt niks om op te matchen... Of ga je weer 'LIKE' gebruiken en dan hopen dat er maar 1 Jan in de 'Beheerders'-tabel staat? Ik zou Wikipedia: Databasenormalisatie aandachtig door gaan nemen als ik jou was :P

Sowieso erg apart dat in je query "Voer een achternaam in:" moet staan, dat is een labeltje op je presentatielaag, niet de (deel)inhoud van een input-parameter hoop ik?

[ Voor 31% gewijzigd door Paul op 22-11-2012 12:31 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 11:23
Dat is inderdaad het punt. Ik snap nu wat jullie bedoelen. De GROUP BY is dan ook helemaal niet nodig met deze code:

SQL:
1
2
3
SELECT s.naam, s.ontwikkelaar, s.leverancier, s.beheerder
FROM software AS s
WHERE (((s.beheerder) Like "*" & [Voer een achternaam in:] & "*"))


Ik weet wat database normalisatie inhoudt, maar in deze situatie kan ik het niet anders aanpassen. Anders had ik ook wel gezorgd dat de ene kolom met achternamen 1:1 gematched kon worden met de achternamen in de andere tabel. Maar helaas gaat dat in deze situatie niet op.

De achternamen zijn uniek genoeg om met een LIKE statement eruit te halen.
Sowieso erg apart dat in je query "Voer een achternaam in:" moet staan, dat is een labeltje op je presentatielaag, niet de (deel)inhoud van een input-parameter hoop ik?
Correct ;)

[ Voor 59% gewijzigd door ThinkPad op 22-11-2012 12:34 ]

Pagina: 1