Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalte mit "Zufallswerten" füllen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von dieych, 6 August 2012.

  1. dieych

    dieych Benutzer

    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)
     
  2. ukulele

    ukulele Datenbank-Guru

    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
     
  3. dieych

    dieych Benutzer

    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?
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. ukulele

    ukulele Datenbank-Guru

    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
     
  6. dieych

    dieych Benutzer

    So geht es dann auch ohne ID... Danke!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden