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を指定された単位に切り捨てます。

2つの理由:

  1. 表内のすべての年の8月の合計ではなく、 2012年などの特定の年の8月の注文数が必要です。date_trunc('month', orderdate)まさにそれを行い、偶然に複数年を混ぜることを防ぎます。複数年にわたって複数の行を取得します。

  2. この1つの式の両方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
Old 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)

SELECTとORDERBYの両方で同時にうまく機能させるには、GROUPBYに両方の値が必要です。

于 2012-10-28T02:24:56.590 に答える