Spalte updaten
Thomas D.
- datenbank
Auf ein neues.
Ich kann mir mit dem befehl
SELECT Gewicht * Preis /1000 AS Erloese, tour_ID, Verladedatum, Kunde, Verladebetrieb, Lieferscheinnummer,Gewicht,touren.Entladewerk, Abgerechnet, Kennzeichen, Sondertour
FROM touren_kunden AS touren, touren AS touren_kunden
WHERE touren.Verladewerk = touren_kunden.Verladewerk
AND touren.Entladewerk = touren_kunden.Entladewerk
AND Lieferscheinnummer = '$T1'
den Verdienst den die entsprechende Tour gebracht hat auswerfen lassen.
Wie kann ich denn nun mit der eingabe einer Lieferscheinnummer die Spalte Erloese updaten mit dem Wert der errechnet wurde.
Zur Verdeutlichung.
Eingabemaske (Lieferscheinnummer) und im Hintergrund soll mit UPDATE der Wert in die Tabelle touren Spalte Erloese hinein geschrieben werden.
Jemand eine Idee ???
Hi,
Wie kann ich denn nun mit der eingabe einer Lieferscheinnummer die Spalte Erloese updaten mit dem Wert der errechnet wurde.
äh, mit UPDATE?
Jemand eine Idee ???
Wo genau liegt denn Dein Problem?
Cheatah
Schau mal zur veranschaulichung
UPDATE touren set Erloese = 'SUM (Gewicht * Preis /1000)' WHERE touren.Verladewerk = touren_kunden.Verladewerk
AND touren.Entladewerk = touren_kunden.Entladewerk
AND Lieferscheinnummer = '1234567890'
Das Ergebnis soll in die Spalte Erloese hinein geschrieben werden
hi,
Schau mal zur veranschaulichung
UPDATE touren set Erloese = 'SUM (Gewicht * Preis /1000)'
willst du wirklich den _text_ 'SUM (Gewicht * Preis /1000)' in die spalte Erloese eintragen?
gruß,
wahsaga
Nee nicht wirklich sondern nur die Summe die errechnet wird.
Ich habs
UPDATE touren,
touren_kunden SET touren.Erloese = '(SUM (touren.Gewicht * touren_kunden.Preis /1000))' WHERE touren.Verladewerk = touren_kunden.Verladewerk AND touren.Entladewerk = touren_kunden.Entladewerk AND touren.Lieferscheinnummer = '1234567890'
Wahsaga du hattest recht so geht es nicht jetzt hab ich den SUM Befehl in der Spalte stehen.....
Geb mir mal bitte einen Tip wies richtig aussehen muss
HILFE wie bekomme ich das hin...
insert into touren (touren.Erloese) SELECT Gewicht * Preis /1000 AS Erloese
FROM touren_kunden, touren
WHERE touren.Verladewerk = touren_kunden.Verladewerk
AND touren.Entladewerk = touren_kunden.Entladewerk
AND Lieferscheinnummer = '1234567890'
nur füge ich so eine neue Zeile ein, wie geht das mit einem UPDATE Befehl ohne Installation von MySQL 4.1.7 wo ich Subqueris einsetzen kann ?????
So hab mal was gestrickt
UPDATE touren set touren.Erloese = '(SUM (touren.Gewicht * touren_kunden.Preis /1000))' WHERE touren.Verladewerk = touren_kunden.Verladewerk
AND touren.Entladewerk = touren_kunden.Entladewerk
AND Lieferscheinnummer = '1234567890'
nur bekomme ich dabei den Fehler
#1109 - Unknown table 'touren_kunden' in where clause
was ist hier falsch, die Rechnung hab ich doch schon in einer Klammer gemacht
Moin!
SELECT Gewicht * Preis /1000 AS Erloese, tour_ID, Verladedatum, Kunde, Verladebetrieb, Lieferscheinnummer,Gewicht,touren.Entladewerk, Abgerechnet, Kennzeichen, Sondertour
FROM touren_kunden AS touren, touren AS touren_kunden
Gibt es einen Sinn, warum du der einen Tabelle den Namen der anderen Tabelle und der anderen Tabelle den Namen der einen Tabelle gibst? Warum überkreuz die Namen austauschen? Ist doch nur unnütz kompliziert und verwirrend hinterher, weil du nicht mehr sicher weißt, ob die Spalte des Alias "touren" jetzt tatsächlich zur Tabelle "touren" oder zu "touren_kunden" gehört.
Dieses Überkreuzmanöver signalisiert jedenfalls sehr eindeutig, dass du noch etwas in den Kinderschuhen steckst mit deinem SQL.
WHERE touren.Verladewerk = touren_kunden.Verladewerk
AND touren.Entladewerk = touren_kunden.Entladewerk
AND Lieferscheinnummer = '$T1'den Verdienst den die entsprechende Tour gebracht hat auswerfen lassen.
Wie kann ich denn nun mit der eingabe einer Lieferscheinnummer die Spalte Erloese updaten mit dem Wert der errechnet wurde.
UPDATE tabellenname SET spalte = wert WHERE bedingung
In deinem Fall:
tabellenname = "touren" oder "touren_kunden"
spalte = "erloese"
wert = deine Rechnung
bedingung = "tour_id = die-tour-id aus dem SELECT-Ergebnis"
Mit anderen Worten: Du hast (solltest du, wenn das nicht der Fall ist, in jedem Fall anlegen) ein ID-Feld, welches unabhängig von irgendwelchen anderen Daten jedem Datensatz eine eindeutige Nummer zuordnet. Da du im SELECT diese ID mit abfragst und parallel auch dein Erlös-Ergebnis, kannst du diese beiden Angaben perfekt nutzen, um damit einen ganz einfachen UPDATE zu generieren.
Bedenke aber: Mehrfache UPDATEs kosten Performance. Wenn du die gesamte Tabelle durchrechnen lassen willst, dann kannst du das auch mit einem einzigen Statement erledigen:
UPDATE touren SET erloese = 0
Das setzt alle Erlös-Angaben der gesamten Tabelle auf Null. Anstelle der Null kannst du auch eine Berechnung mit den Werten aus anderen Spalten dieses Datensatzes durchführen:
UPDATE touren SET erloese = Gewicht * Preis /1000
Das rechnet für alle Datensätze jeweils den Erlös aus und speichert ihn in der Spalte "erloese".
- Sven Rautenberg
Moin Sven
Danke erstmal für dein Statement. Ich bastel seit einiger Zeit mit SQL rum und finde es macht Spass damit zu arbeiten. Auf deine Frage hin warum Überkreuzt mit 2 tabellen.
Schau mal :
CREATE TABLE touren\_kunden (
kd\_ID int(11) NOT NULL auto_increment,
Kunde varchar(254) NOT NULL default '',
Verladewerk varchar(254) NOT NULL default '',
Entladewerk varchar(254) NOT NULL default '',
Preis varchar(6) NOT NULL default '',
PRIMARY KEY (kd\_ID)
)
dort steht anhand der Gleichheit vom Verladewerk, Entladewerk den es auch in der Tabelle touren gibt der Preis drin.
Da es für eine Tour immer den selben Betrag gibt errechne ich ihn damit.
Der Updatebefehl sollte dazu beitragen das in der Spalte Erloese in der Tabelle touren der Betrag eingesetzt wird.
Kurzum ich wollte in einem Eingabefeld nur die Lieferscheinnummer eingeben und das SQL sollte mir den Erloes in die Spalte schreiben.
Ich hab gerade mal mit den Update Befehlen rum gespielt, leider bekomme ich es nicht hin.
Ich poste dir hier noch die Struktur der Tabelle touren
CREATE TABLE touren (
tour\_ID int(11) NOT NULL auto_increment,
Verladedatum date NOT NULL default '0000-00-00',
Verladewerk varchar(255) NOT NULL default '',
Verladebetrieb varchar(255) NOT NULL default '',
Lieferscheinnummer varchar(255) NOT NULL default '',
Gewicht varchar(255) NOT NULL default '',
Entladewerk varchar(255) NOT NULL default '',
CoilNr varchar(255) NOT NULL default '',
Abgerechnet varchar(10) NOT NULL default '',
Kennzeichen varchar(255) NOT NULL default '',
Sondertour varchar(255) NOT NULL default '',
news\_datetime datetime NOT NULL default '0000-00-00 00:00:00',
Erloese varchar(254) NOT NULL default '',
PRIMARY KEY (tour\_ID)
)
wie du sehen kannst werden jedem Datensatz eine eindeutige ID zugewiesen, darauf hab ich dann doch schon geachtet.
Es wäre nett von dir wenn du mir ausnahmsweise die UPDATE Syntax posten könntest denn ich komm da leider nicht weiter.
Gruss Thomas
Moin!
Moin Sven
Danke erstmal für dein Statement. Ich bastel seit einiger Zeit mit SQL rum und finde es macht Spass damit zu arbeiten. Auf deine Frage hin warum Überkreuzt mit 2 tabellen.
Du hast diese Frage falsch verstanden.
Zwei Tabellen zu benutzen ist ok, aber die Aliasnamen überkreuz zu tauschen ist nicht ok.
Aliasnamen überhaupt zu benutzen ist nur sinnvoll, wenn man damit irgendwas erleichtert. Üblicherweise werden damit lange Tabellennamen abgekürzt, damit man an anderen Stellen nicht soviel tippen muß.
Konkret bei dir: Statt
FROM touren_kunden AS touren, touren AS touren_kunden
wäre
FROM touren_kunden AS tk, touren AS t
viel schlauer. Oder eben komplett ohne AS-Angaben.
Denn mit deinem jetzigen Statement bindest du die Tabelle "touren_kunden" unter dem Namen "touren" ein, und die Tabelle "touren" unter dem Namen "touren_kunden", was bedeutet: Wenn du vorne im SELECT oder hinten im WHERE die Spalte "touren.irgendwas" angibst, greifst du nicht auf die Tabelle "touren" zu, sondern auf die Tabelle "touren_kunden", weil du den Aliasnamen so gesetzt hast. Und das wird dann doch etwas verwirrend.
Das ist ungefähr so, als ob du von "Äpfeln" und "Birnen" sprichst, aber den Apfel als "Birne" und die Birne als "Apfel" bezeichnest. Solange du und jeder andere das weiß, ist das noch ganz witzig, aber sobald jemand das nicht weiß, wird er dir echten Birnensaft eingießen, wenn du "Birnensaft" verlangst, aber in Wirklichkeit Apfelsaft wolltest.
Der Updatebefehl sollte dazu beitragen das in der Spalte Erloese in der Tabelle touren der Betrag eingesetzt wird.
Das ist im Grundsatz schlechtes Tabellendesign. Man speichert keine Daten in separaten Spalten, die man errechnen kann. Weil sowas zu Inkonststenzen führen kann. Was ist, wenn sich die Ausgangszahlen verändern? Dann muß zwingend auch die Berechnung neu durchgeführt werden. Vergißt man das, oder kommt es zwischen Veränderung der Ausgangszahl und Neuberechnung der Ergebnisse zu lesenden Datenzugriffen, werden ungültige, zumindest aber falsche Daten, ausgeliefert.
Solche Ergebnisse sollte man wirklich nur dann speichern, wenn man dadurch erstens einen heftigen Performancevorteil erhält, zweitens diesen Vorteil auch wirklich benötigt, weil man nicht solange warten KANN, drittens dann ordentliche Caching-Mechanismen implementiert, die das vorberechnete Ergebnis vor Veränderungen der Ausgangszahlen löschen, damit eine Neuberechnung erzwungen wird, welche in keinem Fall falsche Ausgangswerte rausläßt, und viertens darf dieser Mechanismus natürlich nicht noch mehr Performance schlucken, als die ursprüngliche Berechnung. Das bedeutet insbesondere bei Ausgangswerten, die sich häufig ändern, dass so ein Caching eher nicht einsetzbar ist.
Kurzum ich wollte in einem Eingabefeld nur die Lieferscheinnummer eingeben und das SQL sollte mir den Erloes in die Spalte schreiben.
Warum willst du den Erlös speichern? Du kannst doch mit deinem Select und der darin enthaltenen Rechnung den Erlös jederzeit ausrechnen lassen. Das ist durchaus die übliche Vorgehensweise bei solchen Dingen.
Ich hab gerade mal mit den Update Befehlen rum gespielt, leider bekomme ich es nicht hin.
Ich schätze, das hängt wieder mal von der MySQL-Version ab. UPDATE ist in älteren Versionen nur in der Lage, auf eine einzige Tabelle zuzugreifen. Ein JOIN im UPDATE ist erst in irgendeiner 4er-Version möglich, das müßtest du mal genauer in der MySQL-Doku nachlesen. Insofern: Wenn deine MySQL-Version so ein Update nicht kann, dann kommst du ohnehin nicht drum herum, zuerst dein SELECT mit der Berechnung abzuschicken und dann für jedes Ergebnis ein UPDATE auf die Tabelle "touren" loszulassen - WHERE tour_ID = 'die tour_ID aus dem SELECT'.
- Sven Rautenberg
Tach Sven
WOW ich bin beeindruckt, von deimem Statement.
Das sich Werte verändern hatte ich ueberhaupt garnicht bedacht
und habe gestern schon (weil ich das mit dem Update nicht hinbekam) mit den Select Befehlen gearbeitet.
Sicherlich bin ich noch ein Newbie aber es macht um so mehr Spass wenn man mal vernünftigen Antworten bekommt anstatt nur Kommentare.
Ich werde deine Sachen mal beherzigen und weiter verwenden.
Thomas