2013-08-16 44 views
2

我一直在寻找了几个小时试图找出为什么ORDER BY不会对公式正常工作:ORDER BY公式工作不正常

SELECT *, 
    FORMAT(LowPriceCompetitor - (-(products.distPrice + 0.30)/((Rates.rate + 0.02 + Rates.defaultMarkup) - 1)), 2) AS margin 
FROM products 
LEFT JOIN Rates ON products.MasterCategoryID = Rates.categoryID 
ORDER BY margin 

我怎样才能让MySQL正确排序的输出式?这应该工作!

+1

它*做*工作。 ORDER BY排序指定序列中的行。正如你通过查阅MySQL文档发现的那样,'FORMAT'函数返回一个字符数据类型。 ORDER BY正在操作字符串。而你想要的是对数值进行排序。将字符数据类型转换为数字的一种快速方法是将“0”添加到“123.4'+ 0”。 – spencer7593

回答

2

我很惊讶,我在这里找不到这个。解决方案是使用ROUND而不是FORMAT。即

SELECT *, 
    ROUND(LowPriceCompetitor - (-(products.distPrice + 0.30)/((Rates.rate + 0.02 + Rates.defaultMarkup) - 1)), 2) AS margin 
FROM products 
LEFT JOIN Rates ON products.MasterCategoryID = Rates.categoryID 
ORDER BY margin 

我应该一直使用ROUND开始。 FORMAT以字符串形式返回结果... 我希望这可以帮助别人。

+0

你应该接受你的答案作为正确的答案:) – Itay

+0

你是怎么做到的?先回答然后问这个问题?问与答完全相同。 – vee

+0

@vinodadhikary我开始问这个问题,并在过程中发现了答案,所以我点击了“回答你自己的问题”按钮。显然是为了这个确切的情况而设立的。 –

3

快速方法作为数值(例如,值由FORMAT()功能,或返回一个字符数据类型的任何其它表达返回)到字符串进行排序,

是添加零来表达。 MySQL将执行从字符到数字的隐式转换:

SELECT FORMAT(lpc - (-(p.dp + 0.30)/((r.rate + 0.02 + r.dm) - 1)), 2) AS margin 
    FROM t 
    JOIN ... 
ORDER BY margin+0 
       ^^---- quick fix here is to add zero