2014-12-11 3 views
0

Я новичок в oracle sql. Я пытаюсь понять следующий код. Может ли кто-нибудь объяснить в простых выражениях, как min (amt) сортирует результаты в порядке возрастания? Я думал, что min() возвращает одно значение. Почему max (amt) дает точные результаты? Сортировка по min() дает результаты, которые я хочу, но пытаюсь понять, как это делается.заказать по min() в sql

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

У вас есть группа пунктом в этом запросе, в противном случае, вы должны получить 'ORA-00937: не одногрупповая групповая функция'. Пожалуйста, покажите свой фактический запрос, если он не слишком длинный, или придумайте какой-нибудь тестовый пример, который мы можем исследовать. –

+1

'min (amt)' упорядочивает минимальное значение 'amt' в любой группе, которую вы указали. Я думаю, вы могли бы смириться с 'min' и' max' с направлением сортировки ('asc' и' desc'). – Dean

+0

Я голосую @Dean FTW. – paqogomez

ответ

0

Целью является упорядочить результаты по группировкам. Значения:

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

В самом деле, выше было бы "естественным" заказывать для них. Однако, упорядочение по базе данных будет алфавитным, а значит:

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

Для того, чтобы получить бункера в правильном порядке, значение выборки необходимо из каждого бункера (ящики не пересекаются, поэтому любое значение будет делать). Принимая минимум, полученные бункеры находятся в правильном порядке.

Кстати, вы можете заказать по закромах, если они были нулями слева:

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

Затем алфавитный порядок будет соответствовать интуитивный порядок.

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 
Смежные вопросы