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

sitze auf der Leitung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von peperonilenchen, 25 April 2013.

  1. peperonilenchen

    peperonilenchen Benutzer

    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
     
  2. Tommi

    Tommi Datenbank-Guru

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

    akretschmer Datenbank-Guru


    COALESCE ist Dein Freund.
     
  4. peperonilenchen

    peperonilenchen Benutzer

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

    akretschmer Datenbank-Guru

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

    Andreas
     
  6. peperonilenchen

    peperonilenchen Benutzer

    Hi hab dir ein Bild von der Tabelle gemacht
    [​IMG]

    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
     
  7. Tommi

    Tommi Datenbank-Guru

    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
     
  8. peperonilenchen

    peperonilenchen Benutzer

    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
     
  9. akretschmer

    akretschmer Datenbank-Guru

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

    peperonilenchen Benutzer

    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.
     
  11. Tommi

    Tommi Datenbank-Guru

    Hallo Lena,

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

    Viele Grüße,
    Tommi
     
  12. peperonilenchen

    peperonilenchen Benutzer

    ?? 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
     
  13. akretschmer

    akretschmer Datenbank-Guru

    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
     
  14. peperonilenchen

    peperonilenchen Benutzer

    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
     
  15. akretschmer

    akretschmer Datenbank-Guru

    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
     
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