Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Gruppierung nach bester Lieferzeit und bestem Preis

Begonnen von thorstens1304, Januar 03, 2012, 16:17:46

⏪ vorheriges - nächstes ⏩

thorstens1304

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?

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

thorstens1304

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.

oma

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
nichts ist fertig!

thorstens1304

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?

oma

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  sind einige angegeben.

Gruß Oma
nichts ist fertig!