Сортировка в Oracle SQL - PullRequest
       2

Сортировка в Oracle SQL

0 голосов
/ 11 сентября 2018

У меня есть запрос select в Oracle SQL, который возвращает таблицу с результатами

Location     count  
 site1       95000
 site2       556900
 site3       65600

Затем я использовал функцию этажа (floor/1000), чтобы получить последние 3 цифры и добавить ее с помощью K +, используя floor(count/1000) || 'K+' as count. После этого я получаю такой стол

Location    count  
site1       95K+
site2       556K+
site3       65K+

Теперь проблема в том, что когда я сортирую таблицу результатов, используя order by count desc, она сортируется следующим образом

Location    count  
site1       95K+
site3       65K+
site2       556K+

Сортировка происходит с учетом 1-й цифры, я думаю. Мне нужно, чтобы результат генерировался таким образом при сортировке по убыванию.

Location    count  
site2       556K+
site1       95K+
site3       65K+

Есть ли способ достичь этого результата? Любые предложения

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Хотя вам уже сказали, что делать (просто повторяю: order by count(*) desc), вот пример, который показывает, как вы можете обращаться с такими значениями (в сочетании чисел и букв), как правило:

  • вы бы извлекли числовую часть (я использовал REGEXP_SUBSTR, хотя простой SUBSTR + INSTR в этом примере работал бы просто отлично),
  • применить TO_NUMBER к нему (иначе вы все равно будете сортировать строки и получить неправильный результат)

SQL> with test (loc, num) as
  2    (select 'site1',  95000 from dual union all
  3     select 'site2', 556900 from dual union all
  4     select 'site3',  65600 from dual
  5    )
  6  select loc,
  7         floor(sum(num) / 1000) || 'K+' cnt    --> SUM represents your COUNT
  8  from test
  9  group by loc
 10  order by to_number(regexp_substr(cnt, '^\d+')) desc;

LOC        CNT
---------- ------------------------------------------
site2      556K+
site1      95K+
site3      65K+

SQL>
0 голосов
/ 11 сентября 2018

Попробуйте запрос ниже:

select location,floor(count/1000)||'K' as count
from tablename
order by floor(count/1000) desc
0 голосов
/ 11 сентября 2018

Отформатированное значение является строкой, и оно будет отсортировано как строка (например, 10K+ предшествует 2K+ в порядке словаря, отсортированном по возрастанию).Поместите отформатированное значение в предложение SELECT, но упорядочите по исходному значению в предложении ORDER BY:

SELECT Location, FLOOR(count/1000) || 'K+' AS k_formatted_count
FROM ...
ORDER BY count DESC
0 голосов
/ 11 сентября 2018

Я считаю, что вы можете просто сделать:

order by count(*) desc

То есть, даже если вы изменяете значение count() в select, вы все равно можете заказать по фактическому количеству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...