1

我必须进行咨询,该咨询必须给我以下信息:

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

如何解决?

4

2 回答 2

4

我建议date_trunc()改为。date它将/截断timestamp为给定的单位。

有两个原因:

  1. 您需要特定年份(如 2012 年)八月份的订单数量,而不是表中所有年份八月份的总和。date_trunc('month', orderdate)正是这样做的,并防止您意外混合多年。您获得多年的多行。

  2. 你可以同时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);

db<>fiddle here
sqlfiddle

对于完整的月份名称,就像您的第一个示例所暗示的那样:

to_char(date_col, 'Month')

对于非英语的本地化名称:

to_char(date_col, 'TMMonth')

手册中的详细信息。

于 2012-10-28T03:30:59.717 回答
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 一起使用。

于 2012-10-28T02:24:56.590 回答