【发布时间】:2010-01-11 19:38:39
【问题描述】:
在我最近将我的一个 Rails 应用程序切换到 Heroku 之前,我一直使用 mysql 并不得不进行更改。几乎一切都按预期工作,除了我有一个查询完全时髦。
这是 postgres,但在 mysql 下,除了 EXTRACT DOW 和一些 group by 添加之外,它几乎是相同的,但这不是问题,问题是它习惯于 对列出的星期几求和,现在它对整个表格求和...而且 AVG 也关闭了,因为它还获取表格 avg 而不是列出的日期。
有没有办法获得列出的天数的总和而不必再做一次选择,我错过了什么?...我想避免做 SELECT (SELECT ...) as SUBQUERY 只是为了得到一个列的总和。
谢谢
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,
(AVG(availables.price)*1) AS avg,
(SUM(availables.price)*1) * 2 AS sum,
MAX((SIGN(spots)-1) + 2) AS beds
FROM availables
INNER JOIN rooms
ON availables.room_id=rooms.id
WHERE availables.room_id = '1818' AND availables.price > 0
GROUP BY rooms.id, rooms.name
【问题讨论】:
-
你不能只添加一个 where 子句来过滤过去 3 天的结果吗?
-
spots 是可用位置的数量...还剩 2 张床位等。
-
你能解释一下吗?:MAX((SIGN(spots)-1) + 2) AS 床
-
only one problem with that is that I don't have data for every day, some days may have no data for weeks. Not likely weeks, but possible. ;-(:::: 所以如果我读到这个,你的查询实际上想要从某个时间段中提取前 3 天。您能帮我们定义一下这段时间吗? -
好吧,特定时间只是最新价格。唯一的问题是一周中的几天,周五和周六的价格往往高于工作日的价格。这就是为什么价格是一周中的几天。如果它只是对这些 MAX 进行平均和求和,我会喜欢它。
标签: mysql ruby-on-rails postgresql sum pivot