2017-01-11 3 views
0

グループ別に並べ替えて月単位でソートしようとしています。私はto_char(date_field, 'Month') as monthを使用して月を日付の代わりに文字列として取得しています。これにより、結果には年代順ではなくアルファベット順にソートされた月があります。生成エイリアス化された列に対してto_date()を使用できません。

select fac.facility_cd, 
    fac.name, 
    to_char(oh.create_date, 'Month') as month, 
    count(ol.ord_line_id) as number_orders, 
    sum(ol.retail_price) as total 
from ord_header oh 
    join ord_line ol using(ord_id) 
    join ord_subline os using(ord_line_id) 
    join facility fac using(facility_cd) 
group by 1, 2, 3 
order by 1, 2, 3; 

fac_cd |     name     | month | number_orders |  total 
-------+------------------------------------------+-----------+---------------+------------------ 
502 | ART FURNITURE CO       | December |    1 |    1099 
503 | ABCOASTER        | December |    5 |   144.75 
503 | ABCOASTER        | January |    4 |   115.8 
503 | ABCOASTER        | November |    2 |    57.9 
205 | CHAR-GRILLER (A&J MFG LLC)    | April  |    6 |    424 
205 | CHAR-GRILLER (A&J MFG LLC)    | August |   29 |    4786 
205 | CHAR-GRILLER (A&J MFG LLC)    | December |   21 |   2397.98 
205 | CHAR-GRILLER (A&J MFG LLC)    | February |    5 |    525 
205 | CHAR-GRILLER (A&J MFG LLC)    | January |    2 |    148 
205 | CHAR-GRILLER (A&J MFG LLC)    | July  |   16 |    1504 
205 | CHAR-GRILLER (A&J MFG LLC)    | June  |   18 |    1762 
205 | CHAR-GRILLER (A&J MFG LLC)    | March  |   10 |    720 

は数ヶ月はアルファベット順であることに注意してください。私は答えのためにSO検索が、私はこの問題を解決しようとすると、私が試した:私もこの試みた

ERROR: function to_date(integer, unknown) does not exist 
LINE 11: order by 1, 2, to_date(3, 'Month'); 
         ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

:エラー与え

order by 1, 2, to_date(3, 'Month'); 

order by 1, 2, extract('Month' from oh.create_date); 

をどのこのエラーが返されます:

ERROR: column "oh.create_date" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 11: order by 1, 2, extract('Month' from oh.create_date); 
              ^

どのようにしてこのクエリを変更し、発生した順序で月を注文できますか?

+0

'順:今日:)

EDIT

ないようなクリーンな方法が、何かがトリックを行う必要がありますe_date) '? –

+0

@vkp残念ながら、 'ERROR:column" oh.create_dateはGROUP BY句に現われなければならない、あるいは集約関数で使われなければならないと言います。 'month'(エイリアス)と' 3'を使って 'month 'しかし、役に立たない。 – Will

答えて

2

to_date()を使用しようとしているので、これはpostgresqlと思われますか?とにかく、あなたは@vkpが示唆するもの試すだけでなく、GROUP BY句に列を変更することができます:

group by 1, 2, date_trunc('month',oh.create_date) 
order by 1, 2, date_trunc('month',oh.create_date); 

それは動作しませんので、もし私が今それをテストすることはできません後で決定を探すために教えてください1、2、date_trunc( '月'、oh.creatによって

SELECT 
    t.facility_cd, 
    t.name, 
    to_char(to_timestamp(m::text, 'MM'), 'Month') as month, 
    t.number_orders, 
    t.total 
FROM 
(select fac.facility_cd, 
    fac.name, 
    extract(month from oh.create_date) as m, 
    count(ol.ord_line_id) as number_orders, 
    sum(ol.retail_price) as total 
from ord_header oh 
    join ord_line ol using(ord_id) 
    join ord_subline os using(ord_line_id) 
    join facility fac using(facility_cd) 
group by 1, 2, 3 
order by 1, 2, 3) as t 
+0

私はpostgresを使用しています、良い仮定:)これは私に 'エラー:列" oh.create_dateを与える必要があります "GROUP BY句に表示するか、または集計関数で使用する'。私は 'date_trunc( '月'、oh.create_date)を月としても試しました。これは実行されますが、毎月の最初の秒は月の名前ではなくタイムスタンプとして返​​されます。 – Will

+0

編集がうまくいきました、ありがとう! – Will

+0

喜んで:) –

関連する問題