我将它们转换为文本时对几个月进行排序

时间:2012-10-28 01:35:15

标签: sql postgresql sorting

我必须做一个咨询,必须给我以下信息:

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
...

如何解决?

2 个答案:

答案 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);

-> sqlfiddle demo

如果你真的想要完整的月份名称,就像你的第一个例子暗示:

to_char(date_col, 'Month')

对于非英语本地化名称:

to_char(date_col, 'TMMonth')

Details in the manual.

答案 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。