我一直在使用mysql,直到最近我将一个rails应用程序切换到heroku,然后不得不改变。几乎所有的事情都按预期工作,除了我有一个查询,它做了一些非常有趣的事情。
这是postgres,但在mysql下,除了EXTRACT DOW和一些group by additions之外,它基本上是相同的,但这不是问题,问题是它习惯于
把一周中列出的天数加起来,现在把整张表加起来。。。而且AVG也关闭了,因为它也得到了表AVG,而不是列出的天数。
有没有一种方法可以得到列出的天数的总和,而不必做另一个选择,我错过了什么?... 我想避免做选择(选择…)作为子查询只是为了得到列的总和。
谢谢
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
最佳答案
你没有说明模式是什么,所以我假装所有数据都在一个表中,省略了连接。用你的加入取代“东西”应该没问题。
我创建了一个简单的表来代表您的加入:
wayne=# \d stuff
Table "pg_temp_1.stuff"
Column | Type | Modifiers
----------+---------------+----------------------------------------------------
id | integer | not null default nextval('stuff_id_seq'::regclass)
room_id | integer | not null
bookdate | date | not null
price | numeric(10,2) | not null
Indexes:
"stuff_pkey" PRIMARY KEY, btree (id)
添加了一些数据:
wayne=# select * from stuff;
id | room_id | bookdate | price
----+---------+------------+-------
1 | 1 | 2010-01-11 | 60.00
2 | 1 | 2010-01-10 | 60.00
3 | 2 | 2010-01-10 | 55.00
4 | 2 | 2010-01-09 | 55.00
5 | 3 | 2010-01-09 | 70.00
6 | 3 | 2010-01-08 | 70.00
(6 rows)
这是过去两天的查询,加上今天的查询,按日期分组,包括count、sum和avg price。
wayne=# select bookdate, count(*), sum(price), avg(price) from stuff \
where bookdate >= date_trunc('day', now()) - interval '2 days' \
group by bookdate order by bookdate;
bookdate | count | sum | avg
------------+-------+--------+---------------------
2010-01-09 | 2 | 125.00 | 62.5000000000000000
2010-01-10 | 2 | 115.00 | 57.5000000000000000
2010-01-11 | 1 | 60.00 | 60.0000000000000000
(3 rows)