在sql中按min()排序

时间:2014-12-11 22:21:11

标签: sql oracle sql-order-by min

我是oracle sql的新手。我试图理解以下代码。任何人都可以用简单的方式解释min(amt)如何按顺序对结果进行排序?我认为min()返回一个值。为什么max(amt)给出完全相同的结果?按min()排序给出了我想要的结果,但试图理解它是如何做到的。

select (case when amt > 200 then '>200'
             when amt > 100 then  '>100'
          else '>50'
        end)
count(distinct orderno)
from xyz
where order_date between '...' and sysdate
group by (case when amt > 200 then '>200'
             when amt > 100 then  '>100'
          else '>50'
        end)
order by min(amt)

Result:
> 50
>100
>200

2 个答案:

答案 0 :(得分:0)

目标是按分组排序结果。值为:

  • '>50'
  • '>100'
  • '>200'

事实上,以上将是"自然"为他们订购。但是,数据库的排序将按字母顺序排列,因此:

  • '>100'
  • '>200'
  • '>50'

为了以正确的顺序获取垃圾箱,每个垃圾箱需要一个样本值(垃圾箱是不相交的,所以任何值都可以)。通过采用最小值,生成的箱子顺序正确。

顺便说一下,如果它们在左边填零,你可以按垃圾箱订购:

  • '>050'
  • '>100'
  • '>200'

然后按字母排序符合直观排序。

答案 1 :(得分:0)

您可以尝试以下操作 - 您希望按数字列排序以获得所需的结果:

SELECT '>'||round_amt AS result, order_cnt FROM (
    SELECT CASE WHEN amt > 200 THEN 200 WHEN amt > 100 THEN 100 ELSE 50 END AS round_amt
         , COUNT(DISTINCT orderno) AS order_cnt
      FROM xyz
     WHERE order_date BETWEEN '...' AND SYSDATE
     GROUP BY CASE WHEN amt > 200 THEN 200 WHEN amt > 100 THEN 100 ELSE 50 END
) ORDER BY round_amt