2009-10-20 27 views
0

我有一个查询,我用它来获取日期的具体日期和价格,但现在我想使用类似的方法来获取一周中特定日期的平均价格。对特定日期的SQL特性函数

这是我这适用于特定日期从表中称为可获取的吸合电流查询:

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 

我不工作的第一个尝试,可能是因为DAYSOFWEEK功能是从TO_DAYS太大的不同..

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

也许我正在让这个疯狂的努力,有人知道一个更简单的方法。

它需要看起来像数据这

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

回答

0

如果我理解正确的话,它看起来像你只需要拿出“ - DAYOFWEEK('2009-12- 10')“,因为DAYOFWEEK(availables.bookdate)已经返回给您一个表示星期几的数字。

此外,DAYOFWEEK返回一个数字1到7,而不是0到6,所以您需要相应地进行调整。

做一个“GROUP BY room_id,DAYOFWEEK(availables.bookdate)”以在内部子查询中按房间和日期对平均价格进行分组,然后在外部查询中执行pivoting可能更有效。