Hallo,
irgendwie komme ich gerade nicht weiter. Ich habe folgende Quelldaten:
Artikelnummer Lieferant Lieferzeit Preis
1184 10 0 72,06 €
1184 1 14 70,53 €
1184 22 14 76,13 €
1190 22 0 24,28 €
1190 10 2 23,90 €
1378 10 0 9,44 €
1378 1 0 9,50 €
1378 22 0 9,72 €
1378 23 0 9,99 €
1379 1 0 7,69 €
1379 23 0 8,05 €
1379 22 0 8,12 €
1379 10 0 9,27 €
1380 1 0 7,69 €
1380 23 0 7,70 €
1380 22 0 8,12 €
1380 10 0 9,27 €
Ich möchte jetzt mittels einer Abfrage den besten Lieferanten ermitteln. Dabei ist die Lieferzeit wichtiger als der Preis! Die Artiklenummern sollen also nach aufsteigender Lieferzeit und bei gleicher Lieferzeit nach aufsteigendem Preis gruppiert werden, so dass ich jede Artikelnummer nur noch einmal im Ergebnsi habe. Wie kann ich dies am besten machen?
Hallo Thorsten,
SELECT L.Artikelnummer, Min(L.Lieferzeit) AS Schnellster, Min(L.Preis) AS Billigster, [color=red]First(L.Lieferant) AS Lieferant[/color]
FROM DeineTabelle AS L
GROUP BY L.Artikelnummer
ORDER BY L.Artikelnummer;
Beim rot markierten Teil bin ich mir nicht sicher, ob das so richtig ist, es wird aber der richtige Lieferant angezeigt (getestet).
Ich sehe da aber ein Problem bei den vorliegenden Daten. Was bedeutet denn Lieferzeit 0? Wenn das heisst "nicht bekannt", muss das Feld NULL sein, nicht 0. Weil so bekommst Du natürlich immer den Lieferanten dessen Lieferzeit gar nicht bekannt ist.
Die Abfrage kann dann gefiltert werden:
WHERE IsNull(L.Lieferzeit)=False
hth
gruss ekkehard
Hallo,
erst einmal vielen Dank für die Antwort. Die Lieferzeit wird hier in Tagen angegeben. 0 bedeutet also in 0 Tagen (sofort) und 7 bedeutet in 7 Tagen. In diesem Fall muss also das Min getroffen werden. Wenn dann zwei Lieferanten für eine Artikelnummer die gleiche Lieferzeit haben soll der günstigste ausgeworfen werden.
Hallo,
der Vorschlag von ekkehard dürfte nicht korrekt sein, da zu einer minimalen Lieferzeit ein minimaler Preis gehört und nicht nach der minimalsten Zeit und dem minimalsten Preis gefragt ist.
Das ganze könnte mit Tabelle Artikel etwa so gelöst werden:
select Artikelnummer,
min(Artikel.Lieferzeit) as L,
dmin("Preis","Artikel","Artikelnummer=" & [Artikelnummer] & " And Lieferzeit=" & [L]) as P,
dlookup("Lieferant","Artikel","Artikelnummer=" & [Artikelnummer] & " AND Lieferzeit=" & [L] & " And Preis=" & [P]) AS Lieferant
from Artikel
group by Artikelnummer
order by Artikelnummer
Gruß OmA
Hallo,
die Lösung ist an sich gut. Ich kriege einen Fehler bei der Ausgabe des Lieferanten. Das ist sicher behebbar.
Es gibt aber ein großes Problem: die Geschwindigkeit der Berechnung. Ich benötige etwa 2sec pro Datensatz. Es müssen 110.000 Datensätze analysiert werden und es entstehen am Ende etwa 43.000 Datensätze. Das ist so nicht machbar. Gibt es noch eine andere Lösung?
Hallo Thorsten.
die schlechte performance kommt durch die Domönenfunktionen, bei großen Datensatzmengen kommt es damit zu dem geschilderten Zeitverhalten. Es gibt zur Vermeidung mehrere Möglichkeiten; zum einen können Unterabfragen eingebaut werden oder es können für die Standarddomänenfunktionen "Ersatzfunktionen" benutzt werden, die die Sache evt. schneller machen.
Probiere mal diese Funktionen aus; auf der Seite : http://www.ardiman.de/datenbanken/grundlagen/vba.html#SEC6 (http://www.ardiman.de/datenbanken/grundlagen/vba.html#SEC6) sind einige angegeben.
Gruß Oma