сортировка максимального и минимального значения в sql работает неправильно


У меня есть 1 таблица для ex table1 , и в ней есть имена столбцов: идентификатор, имя, сумма.

id name amount
1  abc  20
2  xyz  50
3  pqr  246

Я хочу отсортировать его от максимального значения до минимального. я написал этот запрос:

SELECT * FROM table1 ORDER BY amount DESC;

Но это дает такой результат:

id name amount
2  xyz  50
3  pqr  246
1  abc  20

Который не является допустимым выводом, который я хочу, я хочу выводить следующим образом:

id name amount
3  pqr  246
2  xyz  50
1  abc  20

Итак, если кто-нибудь знает решение этой проблемы, пожалуйста, дайте мне решение.

Author: Learner, 2015-06-29

4 answers

Вы сохраняете amount в виде строки, как представляется.

Вот два решения. Вы можете преобразовать значения в число для сортировки:

order by amount + 0 desc

Или, сначала упорядочите по длине, а затем по значению:

order by length(amount) desc, amount desc

Как правило, в SQL следует использовать встроенные типы и сохранять значения в соответствующее время. Числа должны храниться в виде чисел (целых, плавающих или десятичных). Даты и время должны храниться как типы даты/времени. И строки могут быть использованы для строковых значений.

 3
Author: Gordon Linoff, 2015-06-29 10:42:22

Это связано с неправильным типом данных.

Укажите тип данных столбца amount как INT или FLOAT.

 0
Author: Pratik C Joshi, 2015-06-29 10:41:55

Смотрите дизайн таблицы с помощью такой команды, как

DESC TABLENAME

Я подозреваю, что ваш столбец "Сумма" является текстовым/переменным, а не числовым.

Или просто выполните следующую команду, а затем попробуйте выполнить запрос.

ALTER TABLE TABLE1 ALTER COLUMN AMOUNT INT
 0
Author: Shahid Thaika, 2015-06-29 10:43:45

Всегда используйте соответствующие типы данных для хранения данных.

Поскольку тип данных столбца amount является строковым, а не числовым, ПОРЯДОК ПО сортирует его на основе значения ASCII.

SQL> WITH DATA(ID, NAME, amount) AS(
  2  SELECT 2,  'xyz',  '50' FROM dual UNION ALL
  3  SELECT 3,  'pqr',  '246' FROM dual UNION ALL
  4  SELECT 1,  'abc',  '20' FROM dual
  5  )
  6  SELECT * FROM DATA
  7  ORDER BY amount DESC;

        ID NAM AMO
---------- --- ---
         2 xyz 50
         3 pqr 246
         1 abc 20

SQL>

Если у вас есть только числовые данные, хранящиеся в виде строки, то вы можете использовать TO_NUMBER для явного преобразования строки в число при сортировке.

ORDER BY to_number(amount) DESC

Например,

SQL> WITH DATA(ID, NAME, amount) AS(
  2  SELECT 2,  'xyz',  '50' FROM dual UNION ALL
  3  SELECT 3,  'pqr',  '246' FROM dual UNION ALL
  4  SELECT 1,  'abc',  '20' FROM dual
  5  )
  6  SELECT * FROM DATA
  7  ORDER BY to_number(amount) DESC;

        ID NAM AMO
---------- --- ---
         3 pqr 246
         2 xyz 50
         1 abc 20

SQL>
 0
Author: Lalit Kumar B, 2015-06-29 11:03:08