sitze auf der Leitung

peperonilenchen

Benutzer
Beiträge
10
Hi folks,

es ist jetzt schon ein paar Jährchen her seit dem ich SQL in folgendem Ausmaß brauchte ... aber nun möchte ich ne komplexere Abfrage machen und hänge...

Ich möchte , dass wenn der Wert von mindays = '$days' (<- das ist ne Variable ... kann also immer anders sein ) nicht existiert ... mindays = 1 verwendet wird in meinem query ...

Hier mein Code:
Code:
$query = "SELECT property_uid AS propertys_uid, MIN(roomrateperday) as roomrateperday, maxpeople,mindays FROM #__jomres_rates WHERE ".$gor." AND DATE_FORMAT('".$searchDate."', '%Y/%m/%d') BETWEEN DATE_FORMAT(`validfrom`, '%Y/%m/%d') AND DATE_FORMAT(`validto`, '%Y/%m/%d') AND roomrateperday > '0'  AND mindays = '".$days."'  GROUP BY property_uid ORDER BY roomrateperday ";

Kann ich das mit nem case oder if im SQL lösen ??

Danke & Lg,
Lena
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
Hi,

innerhalb einer Abfrage nutzt man CASE WHEN ... THEN ... END.
IF ist ein Steuerungsbefehl für einen sequenziellen Ablauf und finden in der Regel in Funktionen oder Prozeduren seine Anwendung.

Viele Grüße,
Tommi
 

akretschmer

Datenbank-Guru
Beiträge
9.173
Hi folks,

es ist jetzt schon ein paar Jährchen her seit dem ich SQL in folgendem Ausmaß brauchte ... aber nun möchte ich ne komplexere Abfrage machen und hänge...

Ich möchte , dass wenn der Wert von mindays = '$days' (<- das ist ne Variable ... kann also immer anders sein ) nicht existiert ... mindays = 1 verwendet wird in meinem query ...


Kann ich das mit nem case oder if im SQL lösen ??

Danke & Lg,
Lena


COALESCE ist Dein Freund.
 

peperonilenchen

Benutzer
Beiträge
10
Ah es ist zum Haare raufen ... mit COALESCE kann ich doch nur auf null prüfen , oder ?

Ich dreh mich aber leider im Kreis ... Ich brauch die Abfrage so dass wenn ich für den Eintrag die entsprechenden Tage bei mindays habe ... also z.B. 2 dann soll er das Ergendis liefern und auch gleich durch 2 teilen ... wenn nicht dann das für 1 Tag ... das ganze soll dann nach den berechneten Ergebnissen sortiert werden ...

Kann ich das mit SQL überhaupt alles unter einen Hut bringen ? Wenn ja kann mir jemand bitte "syntaktisch auf die Sprünge helfen" ? ;-)

@ Tommi: wie bau ich den CASE denn korrekt in mein Statement ein ?

Danke & Lg,

LEna
 

akretschmer

Datenbank-Guru
Beiträge
9.173
Ah es ist zum Haare raufen ... mit COALESCE kann ich doch nur auf null prüfen , oder ?

Ich dreh mich aber leider im Kreis ... Ich brauch die Abfrage so dass wenn ich für den Eintrag die entsprechenden Tage bei mindays habe ... also z.B. 2 dann soll er das Ergendis liefern und auch gleich durch 2 teilen ... wenn nicht dann das für 1 Tag ... das ganze soll dann nach den berechneten Ergebnissen sortiert werden ...

Kann ich das mit SQL überhaupt alles unter einen Hut bringen ? Wenn ja kann mir jemand bitte "syntaktisch auf die Sprünge helfen" ? ;-)

Zeig bitte eine kleine Tabelle mit Werten und was rauskommen soll.

Andreas
 

peperonilenchen

Benutzer
Beiträge
10
Hi hab dir ein Bild von der Tabelle gemacht
tabelle.png


Man gibt ein "Datum von" und ein "Datum bis" ein ... aus diesen beiden Werten ermittle ich per php die Tage , das entspricht den mindays.
Über die prperty_uid lässt sich ermittel wie viele verschiedenne Anbieter es gibt.

Nun möchte ich in der Tabelle (per SQL) nachschauen ob es für den entsprechenden Wert mindays einen Preis gibt. Der Preis bei mindays ist nicht der Tagespreis sondern der Gesamtpreis deshalb muss der dann durch die mindays geteilt werden.
Wenn es keinen entsprechenden Wert gibt dann soll der Wert von mindays = 1 genommen werden .... Alle Preise die so ermittelt werden sollen dann aufsteigen sortiert ausgegeben werden.

Lg Lena
 

Tommi

Datenbank-Guru
Beiträge
284
Hallo Lena,

du möchtest also in der Abfrage den Preis pro Tag ausrechnen. Meiner Meinung nach ist die CASE...WHEN Anweisung hier durchaus sinnvoll.
Das könnte dann wie folgt aussehen:

Code:
SELECT [...],
Preis / CAST((CASE WHEN ISNULL(mindays,0)=0 THEN 1 ELSE mindays END) as float) as Preis_pro_Tag
FROM [...]

Viele Grüße,
Tommi
 

peperonilenchen

Benutzer
Beiträge
10
OK das mit dem Preis per Tag war leicht... ich muss nicht auf 0 prüfen, weil mindestens 1 immer bei mindays stehen muss ... hab das ganze jetzt so gelöst
Code:
SELECT property_uid AS propertys_uid, Round (roomrateperday / mindays,2 )as roomrateperday, maxpeople, mindays FROM n12tv_jomres_rates WHERE  roomrateperday > '0' GROUP BY property_uid ORDER BY roomrateperday
Nur mit der Prüfung ob es für die entsprechenden mindays einen Preis gibt komme ich nicht weiter. Kann mir da noch jemand helfen ?

Danke & Gruß,
Lena
 

akretschmer

Datenbank-Guru
Beiträge
9.173
OK das mit dem Preis per Tag war leicht... ich muss nicht auf 0 prüfen, weil mindestens 1 immer bei mindays stehen muss ... hab das ganze jetzt so gelöst
Code:
SELECT property_uid AS propertys_uid, Round (roomrateperday / mindays,2 )as roomrateperday, maxpeople, mindays FROM n12tv_jomres_rates WHERE  roomrateperday > '0' GROUP BY property_uid ORDER BY roomrateperday
Nur mit der Prüfung ob es für die entsprechenden mindays einen Preis gibt komme ich nicht weiter. Kann mir da noch jemand helfen ?

Danke & Gruß,
Lena

Tommi hat doch auf ISNULL geprüft, nimm doch einfach seine Lösung...
 

peperonilenchen

Benutzer
Beiträge
10
Bei ISNULL bekomm ich nen Fehler
Code:
SELECT property_uid AS propertys_uid, Round(roomrateperday / (ISNULL(mindays, 1)) ,2 )as roomrateperday, maxpeople, mindays FROM n12tv_jomres_rates WHERE  roomrateperday > '0' AND mindays = 3 GROUP BY property_uid ORDER BY roomrateperday

Wenn ich es mit IFNULL probiere bekomme ich aber nur das Ergebnis zurück, dass mindays = 3 hat und die beiden won mindays = 1 (mit der anderen property_uid) nicht.
 

Tommi

Datenbank-Guru
Beiträge
284
Hallo Lena,

das liegt aber wohl eher daran, dass du in deiner WHERE-Klausen auf minddays=3 filterst!

Viele Grüße,
Tommi
 

peperonilenchen

Benutzer
Beiträge
10
?? Aber wie bekomme ich denn alle Einträge von mindays = 3 und alle von mindays = 1 wenn keine mindays = 3 für die property_id vorhanden ist ... das ist schon die ganze Zeit mein Problem ;-)

Lg Lena
 

akretschmer

Datenbank-Guru
Beiträge
9.173
?? Aber wie bekomme ich denn alle Einträge von mindays = 3 und alle von mindays = 1 wenn keine mindays = 3 für die property_id vorhanden ist ... das ist schon die ganze Zeit mein Problem ;-)

Lg Lena

Um das mal zu vereinfachen, Du hast:

Code:
test=*# select * from lena;
 id | value
----+-------
  1 |     1
  2 |     2
  3 |
  4 |     4
  5 |     5
(5 rows)

Und willst, daß da bei ID=3, wo also VALUE NULL ist, statt der NULL (leer) also eine 1 kommt, oder?

Code:
test=*# select *, coalesce(value,1) from lena;
 id | value | coalesce
----+-------+----------
  1 |     1 |        1
  2 |     2 |        2
  3 |       |        1
  4 |     4 |        4
  5 |     5 |        5
(5 rows)

Andreas
 

peperonilenchen

Benutzer
Beiträge
10
Ne nicht ganz es ist so
Code:
pid | value | mindays
----+-------+----------
  1 |    10 |        1
  2 |    10 |        1
  1 |    20 |        2
  1 |    30 |        3
  3 |    10 |        1
(5 rows)

Ich will dass wenn für mindays = 3 kein Wert da ist, dass ich den von mindays = 1 bekomme.

Das Ergebnis wäre also pid 1 -> 30, pid 2 ->10 und pid 3 -> 10

Nur wie bekomme ich dass ?

Lg Lena
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.173
Ne nicht ganz es ist so
Code:
pid | value | mindays
----+-------+----------
  1 |    10 |        1
  2 |    10 |        1
  1 |    20 |        2
  1 |    30 |        3
  3 |    10 |        1
(5 rows)

Ich will dass wenn für mindays = 3 kein Wert da ist, dass ich den von mindays = 1 bekomme.

Das Ergebnis wäre also pid 1 -> 30, pid 2 ->10 und pid 3 -> 10

Nur wie bekomme ich dass ?

Lg Lena

Irgendwie paßt das ned zusammen. Angenommen für mindays=3 gebe es kein Wert in value, dann soll also der Value für pid=1 (alse derselbe pid) aber mindays=1 genommen werden, ja? Das wäre dann aber 10 bei pid=1.

Code:
test=*# select * from lena;
 pid | value | mindays
-----+-------+---------
   1 |    10 |       1
   2 |    10 |       1
   1 |    20 |       2
   3 |    10 |       1
   1 |       |       3
(5 rows)

Time: 0,168 ms
test=*# select distinct on (lena.pid) lena.pid, coalesce(lena.value,l2.value), lena.mindays from lena left join lena l2 on (lena.pid=l2.pid and l2.mindays=1) order by pid, lena.value desc;
 pid | coalesce | mindays
-----+----------+---------
   1 |       10 |       3
   2 |       10 |       1
   3 |       10 |       1
(3 rows)

So?

Andreas
 
Oben