我必须做一个咨询,必须给我以下信息:
Month | Quantity
-------------------
January | XX
February | XX
... | ..
所以,我想:
select to_char(to_timestamp(to_char(date_part('month', orderdate), '999'), 'MM'), 'Mon'), count(*) as quantity from orders group by 1 ORDER BY 1
问题是:月份按“文字”排序我的意思是:
Apr
Aug
Dec
...
如何解决?
答案 0 :(得分:4)
我建议您改用date_trunc()
。它会将date
/ timestamp
截断为给定单位(有关详细信息,请参阅手册链接)。
有两个原因:
您想要的是特定年份8月份的订单数量,例如2012年,不表格中所有年份8月份的总和。 date_trunc('month', orderdate)
正是这样做,并防止你偶然混合多年。你可以多年获得多行。
您可以ORDER BY
和 GROUP BY
这一个表达式,查询速度更快。
SELECT to_char(date_trunc('month', orderdate), 'Mon') AS "Month" -- repeat expr.
,count(*) AS "Quantity"
FROM orders
GROUP BY date_trunc('month', orderdate) -- 1 item covers it
ORDER BY date_trunc('month', orderdate);
如果你真的想要完整的月份名称,就像你的第一个例子暗示:
to_char(date_col, 'Month')
对于非英语本地化名称:
to_char(date_col, 'TMMonth')
答案 1 :(得分:3)
首先,你的to_char
要复杂得多,只需要这样:
to_char(orderdate, 'Mon')
应该足够了。
您按照所选的第一个值进行分组和排序,这就是1
的含义。所以当然结果按月份名称排序,这就是你要求的。相反,您希望按日期的月份组件进行分组和排序,而不是其字符串表示。像这样:
select to_char(orderdate, 'Mon') as "Month",
count(*) as "Quantity"
from orders
group by extract(month from orderdate), to_char(orderdate, 'Mon')
order by extract(month from orderdate)
你需要GROUP BY中的两个值,以使它同时适用于你的SELECT和你的ORDER BY。