2009-10-20 4 views
0

J'ai une requête que j'utilise pour saisir des dates précises et un prix pour la date, mais maintenant je voudrais utiliser quelque chose de similaire à saisir les prix avg pour certains jours de la semaine.sql fonction charateristic pour les dates avg

Voilà ma requête en cours qui fonctionne pour les dates spécifiques pour tirer à partir d'une table appelée disponibles:

SELECT rooms.name, rooms.roomtype, rooms.id, max(availables.updated_at), 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 0, (availables.price*0.66795805223432), '')) AS day1, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 1, (availables.price*0.66795805223432), '')) AS day2, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 2, (availables.price*0.66795805223432), '')) AS day3, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 3, (availables.price*0.66795805223432), '')) AS day4, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 4, (availables.price*0.66795805223432), '')) AS day5, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 5, (availables.price*0.66795805223432), '')) AS day6, 
MAX(IF(to_days(availables.bookdate) - to_days('2009-12-10') = 6, (availables.price*0.66795805223432), '')) AS day7, 
MIN(spots) as spots 
    FROM `availables` 
    INNER JOIN rooms 
    ON availables.room_id=rooms.id 
    WHERE rooms.hotel_id = '5064' AND bookdate 
    BETWEEN '2009-12-10' AND DATE_ADD('2009-12-10', INTERVAL 6 DAY) 
    GROUP BY rooms.name 
    ORDER BY rooms.ppl 

Mon premier coup de couteau qui ne fonctionne pas, probablement parce que la fonction DaysOfWeek est bien différent des TO_DAYS .. Peut-être que je rends cette folie dure et quelqu'un connaît un moyen beaucoup plus simple.

Il faut des données qui ressemble à ceci

#Availables 
id room_id price spots bookdate 
1  26  $5  5  2009-10-20 
2  26  $6  5  2009-10-21 

à:

+----+-------+--------------------+---------------------+---------------------+---------------------+------+------+------+------+ 
| id | spots | name    | day1    | day2    | day3    | day4 | day5 | day6 | day7 | 
+----+-------+--------------------+---------------------+---------------------+---------------------+------+------+------+------+ 
| 25 | 4  | Blue Room   | 14.9889786921381408 | 14.9889786921381408 | 14.9889786921381408 |  |  |  |  | 
| 26 | 6  | Whatever   | 13.7398971344599624 | 13.7398971344599624 | 13.7398971344599624 |  |  |  |  | 
| 27 | 8  | Some name   | 11.2417340191036056 | 11.2417340191036056 | 11.2417340191036056 |  |  |  |  | 
| 28 | 8  | Another   | 9.9926524614254272 | 9.9926524614254272 | 9.9926524614254272 |  |  |  |  | 
| 29 | 10 | Stuff    | 7.4944893460690704 | 7.4944893460690704 | 7.4944893460690704 |  |  |  |  | 
+----+-------+--------------------+---------------------+---------------------+---------------------+------+------+------+--- 

Répondre

0

Si je comprends bien, il semble que vous avez juste besoin de prendre "- DAYOFWEEK ('2009-12- 10 ') "depuis DAYOFWEEK (availables.bookdate) vous renvoie déjà un nombre représentant le jour de la semaine.

De plus, DAYOFWEEK renvoie un nombre de 1 à 7, et non de 0 à 6, vous devrez donc ajuster en conséquence.

Il peut être plus efficace de faire un "GROUP BY room_id, DAYOFWEEK (availables.bookdate)" pour regrouper les prix moyens par chambre et jour dans une sous-requête interne, puis faire le pivotement dans une requête externe.

Questions connexes