Spalte mit "Zufallswerten" füllen

dieych

Benutzer
Beiträge
15
Hallo!
Ich habe eine Tabelle mit Artikelnummern und Preisen. Nun möchte ich eine neue Spalte hinzufügen, in der die jeweiligen Preise mit einer Abweichung von z.B. 30% stehen (also 30% teurer oder günstiger).
So weit bin ich bisher. So habe ich jedoch eine Fehlermeldung. Wie ich die Obere Grenze festlegen soll weiß ich auch nicht so genau.

Code:
UPDATE Tabelle
SET Benchmark = FLOOR(([ EinzelPreis] - [ EinzelPreis]*0.3)+ RAND() * 5)
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
Wenn ich den Preis in deiner Formel durch 100 ersetze bekomme ich Werte zwischen 70 und 74, das scheint mir nicht so gewollt.
0.7 * [ EinzelPreis] + 0.6 * [ EinzelPreis] * rand() ergibt einen zufälligen Wert zwischen 70 und 130 bei einem Ausgangswert von 100.

Außerdem wird der Updatevorgang mit rand() den selben Wert für alle betroffenen Spalten generieren weil rand() offenbar nur einmal eine Zufallszahl generiert. Warum weiss ich nicht, aber du wirst es mit einer Schleife machen müssen.
Code:
WHILE EXISTS (    SELECT    1
                FROM    Tabelle
                WHERE    Benchmark IS NULL )
BEGIN
    UPDATE    Tabelle
    SET        Benchmark = 0.7 * [ EinzelPreis] + 0.6 * [ EinzelPreis] * rand()
    WHERE    Primary_Key = (    SELECT    TOP 1 Primary_Key
                            FROM    Tabelle
                            WHERE    Benchmark IS NULL )
END
 

dieych

Benutzer
Beiträge
15
Danke!

So funktionierts bei mir nicht. Mal zum Verständnis:
Was sagt mir in der ersten Zeile das "SELECT 1"?
Genauso in der WHERE Klausel. Wie wird "SELECT TOP 1 PRimary_Key" abgearbeitet? Was passiert da genau?
Ich habe Primary_Key durch die Artikelnummer ersetzt. Dieser kann auch mehrfach vorkommen. Liegt es vlt daran, dass es nicht funktioniert?
 

ukulele

Datenbank-Guru
Beiträge
4.394
Also mit EXISTS prüfe ich ja nur ob ein Datensatz zurück gegeben wird, ist also egal, ob 1 oder irgendeine Spalte oder * im Select steht. Ich kann dir auch nicht sagen ob es Performance bringt, nicht soviel abzufragen.

Primary_Key müsstest du in der Tat durch eine Spalte ersetzen, die eindeutig ist. Ansonsten hast du zwei Probleme: Du aktuallisiert mehr als einen Datensatz gleichzeitig (bei mehrfacher Artikel-Nr.) und dadurch hast du 1) in all diesen Datensätzen die selbe Zufallszahl und 2) vermutlich wieder das selbe Fehler Problem wie zu Anfang. Daher wäre ein eindeutiger Schlüssel hilfreich. Er dient dazu, nur einen einzelnen Datensatz auszuwählen, der keinen Benchmark Wert hat.

Das könnte man aber zur Not auch über mehrere Spalten machen, ist nur aufwendiger. Einen anderen Weg wüsste ich jetzt nicht.
 

ukulele

Datenbank-Guru
Beiträge
4.394
Könnte sogar viel einfacher gehen:
Code:
WHILE EXISTS (    SELECT    1
                FROM    Tabelle
                WHERE    Benchmark IS NULL )
BEGIN
    UPDATE    TOP(1) Tabelle
    SET        Benchmark = 0.7 * [ EinzelPreis] + 0.6 * [ EinzelPreis] * rand()
    WHERE    Benchmark IS NULL
END
 
Werbung:
Oben