Toon posts:

[SQL / Access] query naar huidige situatie

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

Verwijderd

Topicstarter
Ik probeer een query in Access te maken die alleen die records selecteert waarvan waarde 1 uniek is en waarbinnen waarde 2 de grootste waarde heeft.

Bijvoorbeeld de grootste religieuze groep in verschillende landen

Tabel1
PKLandReligieAantal
1NLprotestant10
2NLkatholiek20
3NLmoslim5
4Irakmoslim98
5Begienatuurgodsdienst2
6Begiekatholiek40


Het beoogde resultaat is dan: alleen de grootste waarde per land:

2NLkatholiek
4Irakmoslim
6Begiekatholiek


Edit: ik stel een vraag zonder vraag...

De vraag is nu: Hoe zorg ik voor deze selectie. Een SQL query met MAX, maar dan moet wel voor ieder afzonderlijk land de MAX waarde worden bepaald. Dat lukt me niet.

[ Voor 12% gewijzigd door Verwijderd op 15-11-2006 13:02 ]


Verwijderd

Topicstarter
Met het eenvoudiger schrijven van de opgave heb ik hem geloof ik zelf misschien al opgelost.


Dit zou moeten werken.

SELECT department, MAX(salary) as "Highest salary"
FROM employees
GROUP BY department;

Ik probeer het even uit.... verspil geen moeite aan reacties tot die tijd

Verwijderd

Dat werkt niet, dan krijg je per groepering het hoogste aantal. Echter, je moet groeperen op al je SELECT velden, dus dan krijg je je volledige recordset terug.

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 15 november 2006 @ 12:10:
Dat werkt niet, dan krijg je per groepering het hoogste aantal. Echter, je moet groeperen op al je SELECT velden, dus dan krijg je je volledige recordset terug.
Het werkt inderdaad maar gedeeltelijk:

Deze geeft wel de maximale waarden per land, maar zodra ik de Tabel1.Religie toevoeg krijg ik weer de volledige recordset:

SELECT Max(Tabel1.aantal) AS maximaal, Tabel1.land
FROM Tabel1
GROUP BY Tabel1.land;

Ik ga nu proberen jouw reactie in SQL om te zetten (helaas is mijn Nederlands beter dan mijn SQL)

Verwijderd

Topicstarter
sorry dat ik op mezelf reageer: ben hard aan het proberen.


Ik heb het werkend, maar daarvoor zijn wel twee queries nodig.

- Een eerste die de maximalen per land bepaalt (zoals hierboven)
- Een tweede die het volgende doet:

Query1 LEFT JOIN Tabel1 ON Land, om de religie te tonen
plus: WHERE Query1.Aantal = Tabel1.Aantal, om alleen de records te tonen waarbij de aantallen tussen tabel1 en query 1 overeenkomen


Dit lijkt me erg omslachtig. Kan dit niet in één?

[ Voor 14% gewijzigd door Verwijderd op 15-11-2006 13:00 ]


  • Batsies
  • Registratie: Mei 2002
  • Laatst online: 27-01-2022

Batsies

E-Developing

Kan je laten zien welke output je exact verwacht, denk wel dat er een andere manier is?

E-Developing


Verwijderd

Topicstarter
Batsies schreef op woensdag 15 november 2006 @ 17:06:
Kan je laten zien welke output je exact verwacht, denk wel dat er een andere manier is?
In feite staat de beoogde output bovenaan in mijn post. In logische termen beschreven:

Toon voor iedere waarde van [land] de record waar [aantal] de grootste waarde heeft.

In SQL doe ik nu het volgende:

Tabel1
[PK] primary key
[Land] char
[Religie] char
[Aantal] long

Query1
SELECT [Land], MAX([Aantal]) AS [Grootste]
FROM [Tabel1]
GROUP BY [Land]

Query2
SELECT [Query1].[Land], [Tabel1].[Religie], [Tabel1].[Aantal]
FROM [Query1] LEFT JOIN [Tabel1] ON [Query1].[Land] = [Tabel1].[Land]
WHERE [Query1].[Grootste] = [Tabel1].[Aantal]
GROUP BY [Query1].[Land], [Tabel1].[Religie], [Tabel1].[Aantal]

Dit werkt, maar lijkt me gruwelijk omslachtig.

Een verdere uitbreiding is dat er voor het bepalen van de max waarde eerst nog een selectie gemaakt moet worden: Alleen records onder een bepaalde waarde (zeg 250) komen in aanmerking. U raad het al; daar heb ik nog een query voor nodig.

Dus in logische termen:
Selecteer slechts de records met [aantal] onder een bepaalde waarde; Toon vervolgens voor iedere waarde van [land] de record waar [aantal] de grootste waarde heeft.


pfff

[ Voor 8% gewijzigd door Verwijderd op 16-11-2006 09:38 ]


Verwijderd

Topicstarter
De volgende lijkt logisch maar werkt niet (in access???)

SELECT Tabel1.Religie, Tabel1.Land, Tabel1.Aantal
FROM Tabel1, [SELECT Land, MAX(Aantal) AS Grootste FROM Tabel1 GROUP BY Land] AS Results
WHERE Tabel1.Land=Results.Land AND Tabel1.Aantal=Results.Grootste;
Pagina: 1