Извините, я должен был включить, как выглядит вывод:
+------+--------+------------+-------+-------+-------+------+---------------------+
| id | sum | name | day1 | day2 | day3 | beds | avg |
+------+--------+------------+-------+-------+-------+------+---------------------+
| 1819 | 131.52 | 8 Bed Dorm | 21.92 | 21.92 | 21.92 | 2 | 21.8980952380952381 |
+------+--------+------------+-------+-------+-------+------+---------------------+
И ввод:
+----+-------+-------+------------+---------+---------------------------+---------------------------+
| id | price | spots | bookdate | room_id | created_at | updated_at |
+----+-------+-------+------------+---------+---------------------------+---------------------------+
| 1 | 27.72 | 1 | 2009-09-14 | 1 | 2009-09-11 15:32:22 +0200 | 2009-09-11 15:32:22 +0200 |
+----+-------+-------+------------+---------+---------------------------+---------------------------+
Ниже работает и делает то, что я хочу, кроме avgs, но это действительно грязно ... так как я не мог понять, как суммировать любым другим способом, не получая суммы за все ночи вместо 2-5 ... т.е. $ 120 против $ 20 512. Решение ниже состояло в том, чтобы сделать то же самое MAX, что и выше, для поворотных дней ... day1 day2 ... и просто сделать то же самое, чтобы сложить их вместе.
Объединение не имеет значения, его можно использовать только для названия комнаты.
SELECT rooms.name, rooms.id,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -3 THEN (availables.price*1) ELSE 0 END) AS day1,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -2 THEN (availables.price*1) ELSE 0 END) AS day2,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -1 THEN (availables.price*1) ELSE 0 END) AS day3,
(MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -3 THEN (availables.price*1) ELSE 0 END) +
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -2 THEN (availables.price*1) ELSE 0 END) +
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2010-01-20')) = -1 THEN (availables.price*1) ELSE 0 END)) *1 * 2 AS sum,
(AVG(availables.price)*1) AS avg,
MAX((SIGN(spots)-1) + 2) AS beds
FROM availables
INNER JOIN rooms
ON availables.room_id=rooms.id
WHERE availables.room_id = '1819' AND availables.price > 0
GROUP BY rooms.id, rooms.name