сортировка максимального и минимального значения в 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
Итак, если кто-нибудь знает решение этой проблемы, пожалуйста, дайте мне решение.
4 answers
Вы сохраняете amount
в виде строки, как представляется.
Вот два решения. Вы можете преобразовать значения в число для сортировки:
order by amount + 0 desc
Или, сначала упорядочите по длине, а затем по значению:
order by length(amount) desc, amount desc
Как правило, в SQL следует использовать встроенные типы и сохранять значения в соответствующее время. Числа должны храниться в виде чисел (целых, плавающих или десятичных). Даты и время должны храниться как типы даты/времени. И строки могут быть использованы для строковых значений.
Это связано с неправильным типом данных.
Укажите тип данных столбца amount
как INT или FLOAT.
Смотрите дизайн таблицы с помощью такой команды, как
DESC TABLENAME
Я подозреваю, что ваш столбец "Сумма" является текстовым/переменным, а не числовым.
Или просто выполните следующую команду, а затем попробуйте выполнить запрос.
ALTER TABLE TABLE1 ALTER COLUMN AMOUNT INT
Всегда используйте соответствующие типы данных для хранения данных.
Поскольку тип данных столбца 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>