在Postgres中订购金额范围值(升序)

时间:2015-11-30 05:41:53

标签: postgresql sql-order-by

您好我想按升序显示结果集。我为此创建了SQL FIDDLE

select amount_range as amount_range, count(*) as number_of_items,
  sum(amount) as total_amount
from (
  select *,case
    when amount between 0.00 and 2500.00 then '<=$2,500.00'
    when amount between 2500.01 and 5000.00 then '$2,500.01 - $5,000.00'
    when amount between 5000.01 and 7500.00 then '$5,000.01 - $7,500.00'
    when amount between 7500.01 and 10000.00 then '$7,500.01 - $10,000.00'
    else '>$10,000.01' end as amount_range
  from Sales ) a
group by amount_range order by amount_range;

我的结果应该像

<=$2,500.00          4  5000
$2,500.01 - $5,000.00     3  12000
$5,000.01 - $7,500.00   2    13000
$7,500.01 - $10,000.00  1    10000
>$10,000.01             1   15000

1 个答案:

答案 0 :(得分:1)

最简单的方法是对每个分组中的值进行排序,例如最小amount

select amount_range as amount_range,
  count(*) as number_of_items,
  sum(amount) as total_amount
from (
  select *,case
    when amount between 0.00 and 2500.00 then '<=$2,500.00'
    when amount between 2500.01 and 5000.00 then '$2,500.01 - $5,000.00'
    when amount between 5000.01 and 7500.00 then '$5,000.01 - $7,000.00'
    when amount between 7500.01 and 10000.00 then '$7,500.01 - $10,000.00'
    else '>$10,000.01' end as amount_range
  from Sales ) a
group by amount_range
order by min(amount);

在Postgres中,您的子查询也可以返回一个数组,其中第一个元素是所需位置,第二个元素是描述存储桶的字符串。然后,外部查询可以ORDER BY您的定位值。

select amount_range[2] as amount_range,
  count(*) as number_of_items,
  sum(amount) as total_amount
from (
  select *,case
    when amount between 0.00 and 2500.00 then ARRAY['1','<=$2,500.00']
    when amount between 2500.01 and 5000.00 then ARRAY['2','$2,500.01 - $5,000.00']
    when amount between 5000.01 and 7500.00 then ARRAY['3', '$5,000.01 - $7,000.00']
    when amount between 7500.01 and 10000.00 then ARRAY['4', '$7,500.01 - $10,000.00']
    else ARRAY['5','>$10,000.01'] end as amount_range
  from Sales ) a
group by amount_range
order by amount_range[1];

对于您的示例,第一种方法恰好更简单。如果您通过比范围更复杂的东西进行分组,第二种方法将非常有用。