【问题标题】:Sorting by non-alphabetic but displaying by alphabetic in group by/order by in postgresql在 postgresql 中按非字母排序,但在 group by/order by 中按字母显示
【发布时间】:2012-10-10 15:43:28
【问题描述】:

我有一个这样的数据库:

 descr    | hours |   timer    
----------+-------+------------
 foo      |   1.3 | 2012-07-14
 foo      |   2.5 | 2012-07-15
 foo      |  2.35 | 2012-07-16
 bar      |     1 | 2012-08-16
 baz      |     1 | 2012-08-16
 buh      |     5 | 2012-08-17

这符合我的预期:

abc=# select extract('month' from timer) as Month, sum(hours) from foo group by Month     order by 1;

 month | sum  
 ------+------
 7     | 6.15
 8     |    7

这并不完全符合我的预期:

abc=# select to_char(timer, 'Month'), sum(hours) from foo group by 1 order by 1 asc;

 to_char  | sum  
----------+------
August    |    7
July      | 6.15

想要的结果是:

month     | sum
----------+-----
July      | 6.15
August    |    7

我理解为什么会在 #3 中发生事情,但是我如何在 PostgreSQL 中以最有效的方式实现预期的结果?

【问题讨论】:

  • 为什么不在order by关键字中使用extract('month' from timer)
  • 我想要的是月份名称(按实际月份排序,而不是按字母顺序)。提取似乎只给了我这个月的数字部分。查看所需的结果(最后的代码粘贴)。

标签: sql postgresql aggregate-functions group-by


【解决方案1】:

您可以在ORDER BY 部分使用提取表达式:

SELECT to_char(timer, 'Month'), SUM(hours)
FROM foo
GROUP BY to_char(timer, 'Month'), extract('Month' from timer)
ORDER BY extract('Month' from timer) ASC;

这个查询得到了想要的结果。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2019-08-08
    • 2012-01-23
    • 2014-03-30
    • 2016-03-06
    相关资源
    最近更新 更多