[SQL] Sorteren goedmaken

Pagina: 1
Acties:

  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Ik heb de volgende query (Access):

code:
1
2
3
SELECT Kop_fotobed.fotosoort, Min(Kop_fotobed.kosten) AS MinOfkosten
FROM Kop_fotobed
GROUP BY Kop_fotobed.fotosoort;


Nu wil ik dat Kop_fotobed.bedrijven ook wordt weergegeven bij de juiste 'MinOfkosten'

zo iets krijg je dan:
code:
1
2
formaat 1    0.45    bedrijf5
formaat 2    0.50    bedrijf2


Het lukt mij nu alleen om de goedkoopste per formaat weer te geven, het bedrijf erachter lukt mij niet... (dit heb ik dus nu:)

code:
1
2
formaat 1   0.45
formaat 2   0.50


Kan iemand mij hierbij helpen? Zit al uren te zoeken/klooien etc...

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:48
:?
Gewoon kop_fotobed.bedrijven toevoegen aan je select-clause en je group by - clause?

https://fgheysels.github.io/


  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
dan zal je dus krijgen:

code:
1
2
3
SELECT Kop_fotobed.fotosoort, Min(Kop_fotobed.kosten) AS MinOfkosten, kop_fotobed.bedrijven
FROM Kop_fotobed
GROUP BY Kop_fotobed.fotosoort, kop_fotobed.bedrijven;

Dit geeft mij echter een lijst met alle prijzen, alle formaten en alle bedrijven...
en
code:
1
2
3
SELECT Kop_fotobed.fotosoort, Min(Kop_fotobed.kosten) AS MinOfkosten, Min(Kop_fotobed.bedrijf) AS MinOfbedrijf
FROM Kop_fotobed
GROUP BY Kop_fotobed.fotosoort;

geeft alleen het laagste nummer weer van de bedrijven...

[ps, bedrijven moest eigenlijk bedrijf zijn, maar dat maakt verder niets uit]

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:48
Kun je dan eens in gewoon nederlands verwoorden wat je eigenlijk precies wel wilt?

https://fgheysels.github.io/


Verwijderd

Select queries met aggregate functies (zoals de jouwe) leveren alleen de resultaten van de aggregate functies op voor die velden en steevast kun je geen extra velden toevoegen. Je select die jij hebt heeft dus 2 velden: de 1e is de fotosoort, per distinct value krijg je 1 resultaat, maar daar horen al meerdere bedrijven bij. Je 2e value is de minimale value die voorkomt voor kosten in het groepje. Dat is oplosbaar, er is maar 1 value per groepje voor veld 1 en 1 value voor minimale kosten per groepje, dus kan deze querie. Het bedrijf er achter plakken lukt zo niet, want het groepje levert meerdere bedrijven op.

Uit het hoofd zou dit wellicht kunnen werken (maar kan niet testen want heb je database niet bij de hand)
code:
1
2
SELECT fotosoort, Min(kosten) AS MinOfKosten, bedrijven FROM fotobed
GROUP BY fotosoort, bedrijven

  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
ik heb 1 tabel kop_fotobed
ik heb 3 velden; fotosoort, kosten en bedrijf

het tabel ziet er zo ongeveer uit:
code:
1
2
3
4
formaat1    0.45    bedrijf1
formaat1    0.50    bedrijf3
formaat2    0.10    bedrijf2
formaat2    0.05    bedrijf4


wat ik wil is dat alleen de laagste prijzen per formaat weergegeven worden met daarachter welk bedrijf het is (dus:)
code:
1
2
formaat1   0.45   bedrijf1
formaat2   0.05   bedrijf4

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Verwijderd schreef op 09 augustus 2002 @ 14:42:
(...)

Uit het hoofd zou dit wellicht kunnen werken (maar kan niet testen want heb je database niet bij de hand)
code:
1
2
SELECT fotosoort, Min(kosten) AS MinOfKosten, bedrijven FROM fotobed
GROUP BY fotosoort, bedrijven
Deze SQL geeft gewoon alles weer... Je denkt dus dat het misschien niet mogelijk is? Moet ik dan 2 queries maken?

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:48
Je hebt om te beginnen een slecht datamodel.
Je hebt redundante data en uw 'datamodel' is niet flexibel.
Begin eens met 3 tabellen te maken:
een tabel foto, een tabel bedrijf en een tabel foto_bedrijf.
De tabel foto houdt informatie bij over de foto's (foto_id, foto_formaat, ...)
De tabel bedrijf houdt informatie bij over bedrijven (bedrijf_id, bedrijfnaam, ...)
en de tabel foto_bedrijf houdt bij welke bedrijven welke foto-formaten leveren en welke prijs). (foto_id, bedrijf_id, prijs)

Begin daar eerst eens mee, en dan kunnen we eens verder denken over de query.

(tip: in de P&W FAQ staat er ergens een linkje naar een tutorial over 'normaliseren'. Neem die misschien ook eens door).

https://fgheysels.github.io/


  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Je hebt om te beginnen een slecht datamodel.
Je hebt redundante data en uw 'datamodel' is niet flexibel.
Begin eens met 3 tabellen te maken:
een tabel foto, een tabel bedrijf en een tabel foto_bedrijf.
De tabel foto houdt informatie bij over de foto's (foto_id, foto_formaat, ...)
De tabel bedrijf houdt informatie bij over bedrijven (bedrijf_id, bedrijfnaam, ...)
en de tabel foto_bedrijf houdt bij welke bedrijven welke foto-formaten leveren en welke prijs). (foto_id, bedrijf_id, prijs)

Begin daar eerst eens mee, en dan kunnen we eens verder denken over de query.

(tip: in de P&W FAQ staat er ergens een linkje naar een tutorial over 'normaliseren'. Neem die misschien ook eens door).
Zo zit het al in elkaar :D Ik dacht het alleen makkelijker te maken door die informatie weg te laten. Het zijn dus al 3 tabellen, 2 met data en 1 die die twee koppelt met een prijs.

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


Verwijderd

Het punt is dat bij 2 bedrijven met dezelfde prijs je niet 1 row krijgt maar 2. Dit is dus het probleem en daarom kan het niet middels die group by. Het is wel een leuk probleem, ik kom er niet 1 2 3 op en daar baal ik wel een beetje van *grmbl*, ik zou het nl. ook niet 1 2 3 weten met subqueries. Ben nog ff bezig met iets anders en dan probeer ik het ff lokaal hier.

  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Verwijderd schreef op 09 augustus 2002 @ 15:07:
Het punt is dat bij 2 bedrijven met dezelfde prijs je niet 1 row krijgt maar 2. Dit is dus het probleem en daarom kan het niet middels die group by. Het is wel een leuk probleem, ik kom er niet 1 2 3 op en daar baal ik wel een beetje van *grmbl*, ik zou het nl. ook niet 1 2 3 weten met subqueries. Ben nog ff bezig met iets anders en dan probeer ik het ff lokaal hier.
Tja, eenleuk probleem :D Het is trouwens wel zo, ik weet dat het mogelijk is, je ziet het namelijk vaker. Alleen de uitvoering stokt hier. I'll keep you'll updated

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


Verwijderd

whoami: Ah, dan kan er iig middels een subquery en TOP en een asc order gejoined worden, mits access dat ondersteunt, geen idee eigenlijk

Verwijderd

doet het waarschijnlijk niet, maar zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT * 
FROM
    foto_bedrijf INNER JOIN bedrijven ON
    foto_bedrijf.BedrijfID = bedrijven.bedrijfID INNER JOIN
    fotos ON foto_bedrijf.fotoID = fotos.fotoID
WHERE
    foto_bedrijf.BedrijfID IN
    (
        SELECT TOP 1 BedrijfID FROM foto_bedrijf AS fb2
        WHERE fb2.fotoID = foto_bedrijf.fotoID
        ORDER BY prijs ASC
    )

  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 01-09 15:10
Dat wordt dus een query in een query:
select * from blabla where id in (select min(kosten) from blabla group by blabla)

Soort van, dus :)

[ Voor 0% gewijzigd door GarBaGe op 09-08-2002 15:26 . Reden: te laat :( ]

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Ik denk dat ik hier maar eens flink over moet nadenken. Niet iets voor een vrijdagmiddag (geintje). Ik ga morgen middag verder, ik kom er nu toch niet uit..

Tnx voor jullie hulp tot nu toe, (nogmaals) ik hou jullie op de hoogte!

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


Verwijderd

garbage: het staat me bij dat je geen group by in een subquery kan hebben, plus jouw subquery levert geen ID's op maar minimale kosten, dus gaat sowieso niet werken.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Kheb ff een kleine test opgezet en dit werkt:
code:
1
2
3
4
5
6
7
select foto.formaat, bedrijf.naam, min(kosten) 
from foto 
inner join foto_kosten on foto_kosten.fotoid = foto.id 
inner join bedrijf on foto_kosten.bedrijfid = bedrijf.id
where kosten = 
  (select min(fk2.kosten) from foto_kosten fk2 where fk2.fotoid = foto.id)
group by foto.formaat, bedrijf.naam


Conceptueel klopt dit, het levert precies op wat je wilt op de manier waarop je dit zou formuleren in nederlands (doe me de fotoformaat, het bedrijf en de prijs waarvan geldt dat de prijs per foto-formaat het laagst is).
Ik zie echter ook dat 2x een aggregate niet echt fijn is als je grote tabellen hebt :) Maar ik zie nog geen andere sluitende oplossing.

  • jonggoud.nl
  • Registratie: Augustus 2001
  • Laatst online: 10-07 08:35
Toch raak ik hierbij weer in de knoop, je hebt voor deze query andere termen gebruikt, na (alweer uren klooien) lukt het mij niet om ze goed in mijn query te passen, ik post daarom een overzichtje van mijn DB. De query rechtsboven moet ik dus aanpassen.

Afbeeldingslocatie: http://www.jonggoud.nl/images/database.jpg

Bedrijven bevat dus een lijst van bedrijven
Formaten bevat een lijst van formaten
Kop_fotobed koppelt bedrijven aan formaten en de bijbehorende prijzen...

Nieuw (groots) project, mail me wat je er van vindt
Tevens in het bezit van een beeldschone vriendin


Verwijderd

Wat is in vredesnaam het verschil tussen kop_fotobed.fotosoort en formaten.formaat? hier klopt iets niet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:48
Die koppeltabel is niet goed. Gebruik de id's uit de tabel foto en bedrijf ipv de namen.

https://fgheysels.github.io/

Pagina: 1