Сумма sql или агрегатная функция в сборном столбце со сложным запросом

У меня есть запрос, который берет средние данные (цены) за 7 дней недели в течение длительного интервала. Средние цены IE за понедельник, вторник и т. д. Он работает нормально, но я не уверен, как я могу в том же запросе суммировать средние значения, которые находит этот запрос? Суммирование Day1..Day5

В его нынешнем виде этот запрос суммирует все цены... т.е. огромное количество... не из среднего.

Любые идеи? Кстати, это из Postgres... Спасибо.

SELECT rooms.name, rooms.id,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2009-12-13')) = 0 THEN (availables.price) ELSE 0 END) AS day1,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2009-12-13')) = 1 THEN (availables.price) ELSE 0 END) AS day2,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2009-12-13')) = 2 THEN (availables.price) ELSE 0 END) AS day3,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2009-12-13')) = 3 THEN (availables.price) ELSE 0 END) AS day4,
MAX(CASE WHEN (EXTRACT(DOW FROM availables.bookdate) - EXTRACT(DOW FROM DATE '2009-12-13')) = 4 THEN (availables.price) ELSE 0 END) AS day5,
(AVG(availables.price)) AS avg,
(SUM(availables.price)) AS sum, MAX((SIGN(spots)-1) + 1) AS beds
 FROM availables
 INNER JOIN rooms
 ON availables.room_id=rooms.id
 WHERE availables.room_id = '1780' AND availables.price > 0
 GROUP BY rooms.id, rooms.name

person holden    schedule 02.12.2009    source источник


Ответы (1)


Вот что должно сработать....

select avg(mon+tues+weds+thur+fri) as averageall,
       sum(mon+tues+weds+thur+fri) as sumall,
  avg(mon) as avgmon,
  avg(tues) as avgtues,
  avg(weds) as avgweds,
  avg(thurs) as avgthurs,
  agv(fri) as avgfri,
MAX((SIGN(spots)-1) + 1) AS beds
from
(
SELECT rooms.name, rooms.id,
CASE WHEN EXTRACT(DOW FROM availables.bookdate) = 1 THEN (availables.price) ELSE 0 END) AS mon,
CASE WHEN EXTRACT(DOW FROM availables.bookdate) = 2 THEN (availables.price) ELSE 0 END) AS tues,
CASE WHEN EXTRACT(DOW FROM availables.bookdate) = 3 THEN (availables.price) ELSE 0 END) AS weds,
CASE WHEN EXTRACT(DOW FROM availables.bookdate) = 4 THEN (availables.price) ELSE 0 END) AS thur,
CASE WHEN EXTRACT(DOW FROM availables.bookdate) = 5 THEN (availables.price) ELSE 0 END) AS fri,
spots, rooms.id, rooms.name
 FROM availables
 INNER JOIN rooms
 ON availables.room_id=rooms.id
 WHERE availables.room_id = '1780' AND availables.price > 0
) 
 GROUP BY rooms.id, rooms.name
)

обратите внимание, что я не проверял, поэтому могут быть опечатки.

person Hogan    schedule 02.12.2009