Zoeken laatst beschikbare data

Status
Niet open voor verdere reacties.

VendClasicc

Gebruiker
Lid geworden
25 feb 2015
Berichten
68
Goeiemiddag,

We zijn bezig om een database te maken voor een prijs overzicht per maand over de afgelopen jaren, deze data word uit ons systeem gehaald door totale verkoop te delen door de aantallen.
Alleen soms hebben we niets verkocht en dan vind het systeem geen prijs, nu wil ik in access een query maken die dan de vorige beschikbare prijs ophaald.
Weet alleen niet hoe ik dit aan moet pakken, zodoende dat ik het hier maar probeer , omdat ik de vorige keer ook zo goed geholpen was :D.

Ik heb in de bijlage een excel bestand gestopt met een kolom prijs en een kolom gewenste data van wat de query zou moeten laten zien.
Kan iemand me hier mee helpen?

Alvast harstikke bedankt.

Gr.
 

Bijlagen

De techniek om zo'n lijst te maken kan in Access ook wel, maar waarom zou je? Je kunt de gewenste vergelijking prima maken met een Cartesisch product. Nou weet je waarschijnlijk niet wat dat is, dus ik dub nu of ik je dat gelijk ga vertellen, of nog niet :).
 
He Octafish,
Heb het een en ander opzocht, maar eerlijke gezegd......
Ik snap er echt helemaal gene bal van hoe ik het cartesisch product kan gebruiken.
Zou je me het kunnen uitleggen of die andere techniek kunnen laten zien aub..?

Gr
 
Ik ben je al voor geweest, en de techniek beschreven in hoofdstuk 17 van de Access cursus :).
Het komt er hier op neer, dat je een tabel maakt met de datums van de tariefwijzigingen en dat je die tabel toevoegt aan de query met de gegevens. Normaal gesproken zie je in die gegevens de records één keer, maar zet je daar een niet-gekoppelde tabel bij dan weet Access niet hoe die losse tabel aan de overige tabellen moet worden gekoppeld. Gevolg: elk record uit de ene tabel wordt gematched met alle records uit de andere tabel(len).

Dus als je een query hebt met 200 bestelrecords dan zie je 200 records. Zet je daar een prijzentabel bij met 10 records, dan maakt Access een uitvoer van 200 * 10 = 2000 records. Daar zit de gevraagde record dan uiteraard ook bij. De bedoeling is dan ook dat je de 9 records die er niet toe doen wegfiltert. En dat doe je door een criterium te maken op basis van het datumveld uit de prijzentabel en de datum waarvan je de prijs wilt weten. Affijn, staat allemaal in Hoofdstuk 17 :).
 
Hi Octafish,

Ik heb je report doorgelezen en snap het principe (ook even h16 erbij gepakt), echter weergeeft mijn data niet individuele prijsmutaties, hierdoor kan het dus zijn dat ik de volgende data heb:
1-1-2012 €6,-
1-2-2012 €6,-
1-3-2012 €6,-
1-5-2012 €7,-

Ik kom er alleen niet uit hoe ik nu die data van 1-2-2012 en 1-3-2012 weg gequeried krijg, zodat ik dus een overzicht heb met alleen de prijsmutaties (begin periode).

Hoe pak je dit aan :S ?
Gr.
 
He Octafish,

Heb nu de methode toegepast op mijn database, echter duurt het uitrekenen heel lang.... even een grove calculatie gemaakt en daar komt uit dat het 12 uur duurt voordat hij klaar is met uitrekenen.
Is er niet een snellere methode???

Gr
 
Rekenmachine :).

Geen idee waarom het zo lang zou duren; om hoeveel records gaat het?
 
Ik heb als het ware om te refereren naar jouw tutorial (benzine), rond de 700 verschillende bezine types, daarvan wil ik de prijshistorie over 4 jaar hebben per maand.
 
Maar dat zegt mij nog niet hoeveel records er in het Cartesisch product zouden zitten. Kun je makkelijk uitrekenen, want dat is [Aantal records Tabel A] * [Aantal records Tabel B]. Aangezien je zelden de complete tabellen nodig hebt, zou je een voorselectie kunnen maken. Hoe minder records, hoe sneller. Maar ik heb redelijk wat grote queries zo gedraaid, en die liepen snel genoeg.
 
Hi Octafish goeiemorgen,

Mijn tabel A heef 42462 rijen en mijn tabel B heeft 23564 rijen, deze heb ik al dan gefilterd (op 1klant) uit de hoofd query waar alle klanten dan ook in staan.

Dit is mijn sql code:
SELECT [Prijstab].Adate, [Prijstab].[Customer Group], [Prijstab].prodcode, [Prijstab].prijs, [Prijstab2].Startdate, [Prijstab2].Enddate INTO [prijs2]
FROM [Prijstab] INNER JOIN [Prijstab2] ON ([prijstab].prodcode = [Prijstab2].prodcode) AND ([prijstab].[Customer Group] = [prijstab].[customer group])
WHERE ((([Prijstab2].Startdate)<=[Adate]) AND (([Prijstab2].Enddate)>=[Adate]))
ORDER BY [Prijstab2].Startdate;

Misschien doe ik iets fout...

Gr.
 
Waar komt het veld [Adate] vandaan? Ik zie nog geen cartesisch product overigens, maar gewoon een normale (toevoeg)query. En die gebruik ik zelf nooit in een toevoegquery. Sowieso is de vraag natuurlijk of je wel een tabel [Prijs2] nodig hebt; misschien kan het wel wat handiger.
 
Hi Octafish de tabel prijstab bevat de velden Adate (datum in de vorm van d-m-yyyy), customer group, productcode
De tabel prijstab2 bevat de velden customer group, productcode, startdate (d-m-yyyy), enddate (d-m-yyyy) en prijs.
De eerste tabel prijstab bevat dus geen prijzen... :D
Ik had een toevoeg query gemaakt om hem dit weekend te laten draaien, dat is gelukt maar kost natuurlijk erg veel tijd.
 
Ik snap het nog steeds niet, maar dat hoeft gelukkig ook niet:). Ik zou namelijk denken dat een bijwerkquery voldoende was geweest. En dat één van de tabellen overbodig is :).
 
Als ik jouw tabellen inlees in een db en er een normaal cartesisch product van maak krijg ik zo'n 26 miljoen records, en dat is een stevig aantal, toch? Maak ik daar een cartesisch gefilterd product van, gefilterd op product, klant en datum dan wordt dat 4202 en dat is al een stuk netter. Die query ziet er dan zo uit:
Code:
SELECT Tabel1.Klant, Tabel1.Productcode, Tabel1.Period, Tabel2.Startdate, Tabel2.Enddate, Tabel2.Prijs
FROM Tabel1, Tabel2
WHERE (((Tabel1.Klant)=[customer group]) AND ((Tabel1.Productcode)=[Tabel2].[ProductCode]) AND ((Tabel1.Period)>=[Startdate] And (Tabel1.Period)<=[Enddate]))
ORDER BY Tabel1.Productcode, Tabel1.Period, Tabel2.Startdate;
Je ziet: geen join te bekennen. En hij is razendsnel, binnen de halve seconde. Lijkt mij dat je met een factor 10 aan records daar 5 seconde van maakt, maar geen 12 uur :D.
 
Hi Octafish,

Harstikke bedankt voor je hulp het werkt nu inderdaad een stuk sneller! hero
Echter heb ik nog 1 klein probleempje waar ik tegenaan loop :D, dat is als ik de tabel met einddatum wil genereren.

Daar heb ik nu deze query voor (gehaald uit jouw uit jouw handleiding H17).

SELECT tBrandstofprijs.[customer group], tBrandstofprijs.BrandstofType AS Productcode, tBrandstofprijs.Wijzigingsdatum AS Startdate, IIf((SELECT
MIN(tmpBrandstof.Wijzigingsdatum) FROM tBrandstofprijs AS tmpBrandstof WHERE
tmpBrandstof.Wijzigingsdatum > tBrandstofprijs.Wijzigingsdatum AND tmpBrandstof.BrandstofType =
tBrandstofprijs.BrandstofType) Is Null,Date(),(SELECT MIN(tmpBrandstof.Wijzigingsdatum) FROM
tBrandstofprijs AS tmpBrandstof WHERE tmpBrandstof.Wijzigingsdatum >
tBrandstofprijs.Wijzigingsdatum AND tmpBrandstof.BrandstofType = tBrandstofprijs.BrandstofType)-1) AS Enddate, tBrandstofprijs.Prijs
FROM tBrandstofprijs;

Dit werkt prima, alleen ik merk als ik van deze query een toevoeg query maak, volgende code:
SELECT tBrandstofprijs.[customer group], tBrandstofprijs.BrandstofType AS Productcode, tBrandstofprijs.Wijzigingsdatum AS Startdate, IIf((SELECT
MIN(tmpBrandstof.Wijzigingsdatum) FROM tBrandstofprijs AS tmpBrandstof WHERE
tmpBrandstof.Wijzigingsdatum > tBrandstofprijs.Wijzigingsdatum AND tmpBrandstof.BrandstofType =
tBrandstofprijs.BrandstofType) Is Null,Date(),(SELECT MIN(tmpBrandstof.Wijzigingsdatum) FROM
tBrandstofprijs AS tmpBrandstof WHERE tmpBrandstof.Wijzigingsdatum >
tBrandstofprijs.Wijzigingsdatum AND tmpBrandstof.BrandstofType = tBrandstofprijs.BrandstofType)-1) AS Enddate, tBrandstofprijs.Prijs INTO tabel2
FROM tBrandstofprijs;

Of als de snel werkende query rechtstreek gecombineerd word met het cartetisch product, dat de wachttijd weer behoorlijk oploopt.

Waar zou dit aan kunnen liggen?

Gr
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan