2009-12-02 1 views
0

J'ai une requête qui prend des données moyennes (prix) de 7 jours de la semaine pour un long intervalle. IE prix moyen pour lundi, mar, etc. Cela fonctionne bien, mais je ne suis pas sûr de savoir comment je peux dans la même requête somme les avgs que cette requête trouve? En l'état cette requête résume l'ensemble de tous les prix ... IE nombre énorme .. pas de la moyenne.sql somme ou fonction d'agrégat sur colonne pré-usine avec requête complexe

Des idées? BTW est de ce Postgres ... Merci

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 

Répondre

1

Voici quelque chose qui devrait fonctionner ....

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 
) 

note que je n'ai pas testé donc il pourrait y avoir des fautes de frappe.