在sql中排序max到min值无法正常工作

时间:2015-06-29 10:38:13

标签: php mysql sql oracle

我有一张桌子用于ex table1 它有列名:id,name,amount。

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 个答案:

答案 0 :(得分:3)

您将amount存储为字符串,它会出现。

这是两个解决方案。您可以将值转换为排序的数字:

order by amount + 0 desc

或者,先按长度排序,然后按值排序:

order by length(amount) desc, amount desc

通常,在SQL中,您应该使用内置类型并将值存储为适当的时间。数字应存储为数字(整数,浮点数或小数)。日期和时间应存储为日期/时间类型。字符串可以用于字符串值。

答案 1 :(得分:0)

它与错误的数据类型有关。

amount列的数据类型设置为INT或FLOAT。

答案 2 :(得分:0)

使用

等命令查看表的设计
DESC TABLENAME

我怀疑您的Amount列是text / varchar而不是数字。

或者只需运行以下命令,然后尝试查询。

ALTER TABLE TABLE1 ALTER COLUMN AMOUNT INT

答案 3 :(得分:0)

始终使用适当的数据类型来存储数据。

由于amount列的数据类型是字符串而非数字, ORDER BY 会根据 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>