SQL Berechnen und Selektieren

poetflashimpact

Cadet 1st Year
Registriert
Juli 2010
Beiträge
13
Hallo Liebes ComputerBase Forum
Folgendes Problem habe ich:

Ich möchte die Preise meines Webshops Updaten. Dafür habe ich eine Tabelle mit Kriterien für die Kalkulation erstellt.

Tabelle 1: ct_supplier_tmp
- supplier_reference (INT)
- price_incl (DUBLE)


Tabelle 2: ct_calculation
- start (DUBLE)
- end (DUBLE)
- calcinproz (INT)

Tabelle 2 Datensätze: ct_calculation

[table="width: 500"]
[tr]
[td]start [/td]
[td]end [/td]
[td]calcinproz [/td]
[/tr]
[tr]
[td]0[/td]
[td]9.99[/td]
[td]200[/td]
[/tr]
[tr]
[td]10[/td]
[td]19.99[/td]
[td]180[/td]
[/tr]
[tr]
[td]20[/td]
[td]49.99[/td]
[td]150[/td]
[/tr]
[tr]
[td]50[/td]
[td]99.99[/td]
[td]130[/td]
[/tr]
[tr]
[td]100[/td]
[td]20000[/td]
[td]110[/td]
[/tr]
[/table]


Code:
SELECT
	ct_supplier_tmp.supplier_reference,
IF( 
	ct_supplier_tmp.price_incl >= ct_calculation.start and ct_supplier_tmp.price_incl <= ct_calculation.end, 
	ROUND((ct_supplier_tmp.price_incl)/100*(ct_calculation.calcinproz)/0.05)*0.05, 
	Null
	)
AS 
	priceinclcalc
FROM 
	ct_supplier_tmp, ct_calculation

Wenn ich jetzt das Query ausführe, erhallte ich erfolgreich die Tabelle.
Das Problem ist, das für jede nicht Erfüllung des IF Kriterium in der SQL Abfrage ein "NULL" geschrieben wird. Führe ich jetzt diese Abfrage mit einem UPDATE durch, geht meine ganze Tabelle Kaput.

Ich habe dies anschließend in 2 Schritten gelöst. Ich Schreibe zuerst die Datensätze in eine Tabelle und anschließend per UPDATE in die "ct_supplier_tmp". Leider braucht die Funktion UPDATE extrem viel ressourcen und zeit.

Gibt es eine Möglichkeit, dies schöner und schneller zu lösen?


Leider konnte ich mein Problem in meinen Augen nicht richtig beschreiben, ich hoffe ihr verstehts. Ansonsten stehe ich gerne für Fragen bereit :D


Besten dank für eure Hilfe, Poetflashimpact
 
SQL für welche Datenbank?

Filtern tut man mit der WHERE Clause, nicht mit IF.

Beispiel:
SELECT Feld
FROM Tabelle
WHERE Value=1
 
Vielen dank für deine Antwort andy_0

Es ist eine MySQL Datenbank.

Das Problem ist, das auch wen ich eine Where Klausel setzt, er diese nicht Interpretiert.
Ich erhalte immernoch das Gleicheergebnis.

Code:
Where
priceinclcalc = Null
 
Hier mal ein ungetestetes Beispiel:

SELECT ct_supplier_tmp.supplier_reference, ROUND((ct_supplier_tmp.price_incl)/100*(ct_calculation.calcinproz)/0.05)*0.05 AS priceinclcalc
FROM ct_supplier_tmp
INNER JOIN ct_calculation ON Tabelle1.Wert = Tabelle2.Wert (WIE_VERBINDEST_DU_DIE_ZWEI_TABELLEN??)
WHERE ct_supplier_tmp.price_incl >= ct_calculation.start and ct_supplier_tmp.price_incl <= ct_calculation.end

Die JOIN Syntax muss angepasst werden, ich verstehe nicht wie du die Tabellen linkst. Kannst du Beispiele aus jeder Tabelle nennen und über welchen Wert sie verbunden werden?

Möchtest du im WHERE auf NULL prüfen, verwendest man WHERE Feld IS NULL bzw. WHERE Feld IS NOT NULL.
 
Vielen dank für deine Hilfe computerbase107. Leider konnte ich mit dem nicht viel anfangen :-)

andy_0 hat mir die Lösung perfekt vorgelegt.

Vielen dank! Habe jetzt sicher eine woche damit verbracht, nach einer lösung zu suchen.


Lösung:
Code:
Select 
	ct_supplier_tmp.supplier_reference,
	ROUND((ct_supplier_tmp.price_incl)/100*(ct_calculation.calcinproz)/0.05)*0.05 AS priceinclcalc
FROM
	ct_supplier_tmp, ct_calculation
WHERE ct_supplier_tmp.price_incl >= ct_calculation.start and ct_supplier_tmp.price_incl <= ct_calculation.end
 
Ganz so vorgelegt hab ich es dir nicht. Meine Vorlage hatte JOINs, während deine die alte Syntax verwendet. Generiert dein Tool diese Syntax würde ich stark dazu anraten, diese zu wechseln. Die JOINs sind zwar ein bisschen umständlich zu schreiben, dafür eindeutig. Die alte Syntax (FROM ct_supplier_tmp, ct_calculation) sorgt bei komplexen Abfragen schnell für Verwirrung.
 
Mein Hinweis geht in die Richtung einer falschen Abfrage in der Where-Klausel:

Einen Zahlenwert sollte man immer auf die Ziffer "0" abfragen und nicht auf den Wert "Null", der nicht der Ziffer "0" entspricht und somit auch die Abfrage hier auf "Null" in den Wald geht.
 
@ computerbase107
Deine Aussage verstehe ich nicht. Auch ein Zahlenwert kann NULL sein. Manchmal ist es ja gewollt, ALLE Einträge außer NULL zu erhalten z.B. für Berechnungen. Sowas entsteht z.B. durch JOINs. Werte die NULL sind lassen sich jedoch nicht berechnen oder sind nicht relevant.
 
Zahlenwerte werden implizit mit der Ziffer "0" initialisiert durchgängig durch alle SQL-Dialekte und SQL-Datenbanken, soweit mir bekannt.

Somit bist Du eher auf der richtigen Seite hier auf die Ziffer "0" abzufragen.
 
Nicht wenn du über einen JOIN Werte zusammen trägst. Dann hat ein Wert, welcher durch OUTER JOIN auf einer Seite nicht vorhanden ist, den Wert NULL. Das Problem des TE ist ja genau solch ein OUTER JOIN.
 
Zurück
Oben