PDA

View Full Version : Ranking- oder Top-Funktion



Kalle57
04-09-06, 14:33
Hallo.
Ich habe 2 Dateien auf der i5. Positionsdatei und Konditionsdatei. In der Positionsdatei kann ein Artikel mit verschiedenen Versandwochen mehrmals vorkommen. In der Konditionsdatei kann der Artikel auch mehrmals stehen, mit einer Wochenangabe, an der ein Preis seine Gültigkeit hat. Ich muss nun für jeden Positionssatz den gültigen Preis in der Woche suchen. Ich muss das Ganze in Access bereitstellen. Dort mit verknüpften Tabellen und einer Abfrage mit Unterabfrage (Select Top 1........) läuft es viel zu lange. 5 Min. für die erste Seite. Ich wollte das Ganze jetzt als eine Pass-Through-Abfrage gestallten. Doch wie sieht hier die SQL-Syntax aus?
Ich weiß es leider nicht.
Irgendein Vorschlag?

LG
Kalle

Fuerchau
04-09-06, 14:53
Nun, da hilft dir nur ein skalarer Subselect:

select ....
, (select preis from preisfile where ..... fetch first 1 row only), ... from ...

Das Problem hierbei ist, dass der Subselect keinen order by enthalten kann und somit das Ergebnis ggf. nicht das gewünschte ist.

Ansonsten hilft da wohl nur eine UDF.

Kalle57
04-09-06, 15:04
Hi,
also kann doch leider mein Problem nicht auf die i5 abschieben. :mad:

Sch........ade.

Danke.


LG
Kalle

B.Hauser
04-09-06, 15:58
Hallo,

vielleicht stehe ich ja auf dem Schlauch, aber Du willst doch einfach die Positions-Datei über Artikel-Nr. und Kalenderwoche mit der Konditions-Datei verknüpfen, um den gültigen Preis für die Position zu ermitteln oder nicht?
Pro Versandwoche und Artikel gibt es in der Konditions-Datei einen Satz?

Wenn ja, musst Du lediglich die Positions-Datei mit der Konditions-Datei über Artikel-Nr. und Versandwoche verknüpfen. (Für beide Dateien sollten allerdings Zugriffswege über ArtikelNr/Versandwoche vorhanden sein)



Select p.*, k.preis
from Position p join Kondition k
on p.ArtikelNr. = k.ArtikelNr
and p.VersandWoche = k.Versandwoche;


Birgitta

Fuerchau
04-09-06, 16:30
@Birgitta
Das Problem ist, dass ich nicht für jede Woche, jedes Datum genau 1 Preis habe.
Meistens wird über "Gültig Von-Bis" eine Kondition geregelt.

Mit "Preisdatum = Konditionsdatum" komme ich da nicht weiter, es gilt eben "Preisdatum >= Konditionsdatum" bzw. "Konditionsdatum <= Preisdatum" bzw. "Konditionsdatum between GueltigVon and GueltigBis".

Es gibt also zu einem Artikel mehrere Preise, wobei ich eben nur den 1. Preis mit dem kleinsten Bis-Datum benötige.

Als Full-Select gilt demnach

select Preis from PreisFile
where artikel='XXXX' and GueltigBis >= Konditionsdatum
Order by Gueltigbis
fetch first 1 row only

Dieses Konstrukt benötige ich aber im scalaren Subselect.
2 Probleme:
1. Sortierung nach einem Feld, dass nicht in der Ergebnisliste steht
2. nur den 1. Satz

Kalle57
05-09-06, 08:05
Hallo und guten Morgen,

da habe ich ja eine kleine Diskussion angeregt.
Es wird wohl nicht so gehen, wie ich es mir gedacht,
oder via Abfrage in Access (die ja viel zu lange lief) gemacht habe.

Da muss ich mir Wohl oder Übel etwas anderes einfallen lassen.

Trotzdem vielen Dank an Euch.

LG
Kalle