我是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
答案 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